2012-04-16 13 views
5

tengo una clase autogenerada de la importación de un servicio web que contiene algo como esto (abreviado):¿Cómo puedo usar atributos en una propiedad definida en la otra mitad de una clase parcial?

[System.Runtime.Serialization.DataMemberAttribute()] 
public System.DateTime StartDate 
{ 
    get 
    { 
     return this.StartDateField; 
    } 
    set { /* implementation prop changed */ } 
} 

Y quiero añadir un atributo formato MVC a este miembro. Así, en otro archivo que contiene la misma partial class definición, me gustaría hacer algo como lo siguiente (lo cual es ilegal):

[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
public DateTime StartDate; 

Un método parcial no sirve de nada aquí porque los métodos parciales deben ser privadas, tienen volverá vacía escriba, debe ser un método, etc.

¿Cómo puedo decorar este miembro?

+0

es el segundo fragmento de código supone que es la definición del 'StartDateField' utilizado por la propiedad' StartDate' en su primer fragmento? –

+0

En lugar de utilizar clases parciales para decorar el código generado, debe utilizar el atributo 'MetadataType' con otra clase que refleje la clase generada. ([Pregunta relacionada] (http://stackoverflow.com/questions/2999936/using-dataannotations-with-entity-framework)) –

+0

@ M.Babcock: no, el segundo fragmento está en una clase parcial del mismo nombre que el primero. Es común agregar extensiones a clases autogeneradas de esta manera, pero generalmente solo agrega propiedades/métodos, no los redefine (afaik, no puede). – Abel

Respuesta

10

Usted podría utilizar MetadataType atributo de la siguiente manera:

[MetadataType(typeof(MyClass_Validation))]  
public partial class MyClass 
{} 

public class MyClass_Validation  
{  
    [DisplayFormat(...)] 
    public DateTime StartDate { get; set; } 
} 
+0

¿Quiere decir que usar MetadataType aquí obliga al compilador a agregar los atributos de firmas similares a las firmas correspondientes en la clase parcial? Suena increíble si eso funciona. – Abel

+0

Sí, use el atributo 'MetadataType' para definir un tipo que contendrá atributos para la clase autogenerada, por ejemplo. También es una buena práctica especificar los atributos de validación en una clase diferente – ionden

+0

@Abel - Sí, esto fue especialmente diseñado para este caso. Y el partido está en Nombre, no en la firma. –

Cuestiones relacionadas