2012-04-16 13 views
5

Ho una classe generata automaticamente da importare un servizio web che contiene qualcosa di simile (abbreviato):Come posso utilizzare gli attributi su una proprietà definita nell'altra metà di una classe parziale?

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

E voglio aggiungere un attributo formato MVC a questo utente. Quindi, in un altro file contenente lo stesso partial class definizione, mi piacerebbe fare qualcosa di simile alla seguente (che è illegale):

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

Metodo parziale è di alcuna utilità qui perché i metodi parziali devono essere private, hanno di ritorno void tipo, deve essere un metodo ecc. ecc.

Come posso decorare questo membro?

+0

è il secondo frammento di codice doveva essere la definizione del 'StartDateField' utilizzato dalla proprietà' StartDate' nel tuo primo frammento? –

+0

Invece di usare classi parziali per decorare il codice generato, dovresti usare l'attributo 'MetadataType' con un'altra classe che rispecchia la classe generata. ([Domande correlate] (http://stackoverflow.com/questions/2999936/using-dataannotations-with-entity-framework)) –

+0

@ M.Babcock: no, il secondo snippet si trova in una classe parziale con lo stesso nome di il primo. È comune aggiungere estensioni alle classi autogenerate in questo modo, ma in genere si aggiungono solo proprietà/metodi, non li si ridefinisce (afaik, non è possibile). – Abel

risposta

10

Si potrebbe utilizzare MetadataType attributo come questo:

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

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

Intendi dire che l'utilizzo di MetadataType qui costringe il compilatore ad aggiungere gli attributi di firme simili alle firme corrispondenti nella classe parziale? Sembra fantastico se funziona. – Abel

+0

Sì, utilizzare l'attributo 'MetadataType' per definire un tipo che conterrà gli attributi per la classe generata automaticamente, ad esempio. È anche buona norma specificare attributi di convalida in una classe diversa – ionden

+0

@Abel - Sì, questo è stato appositamente progettato per questo caso. E la partita è sul nome, non sulla firma. –