2011-01-19 4 views
5

Ho utilizzato l'attributo MetadataType per aggiungere attributi di convalida alle classi che sto generando utilizzando un modello T4. Funziona meravigliosamente, ma mi piacerebbe essere in grado di utilizzare l'attributo DefaultValue su alcune proprietà, in modo che la mia classe MetadataType descriva più completamente le mie classi (e quindi non dovrò implementare il metodo OnCreated in quelle classi) . Posso aggiungere l'attributo alla mia classe MetadataType, ma non ha alcun effetto.Utilizzo di DefaultValueAttribute su una classe utilizzata come tipo in un MetadataTypeAttribute

Ecco alcuni esempi di origine: la parte generata è (ovviamente) in un file diverso. Se istanzio un oggetto Widget, la proprietà Name sarà null.

/// <summary> 
/// This part is generated 
/// </summary> 
public partial class Widget 
{ 
    public string Name { get; set; } 
} 

/// <summary> 
/// This part is hand-coded so I can add attributes, custom methods etc. 
/// </summary> 
[System.ComponentModel.DataAnnotations.MetadataType(typeof(WidgetMetadata))] 
public partial class Widget 
{ 
} 

/// <summary> 
/// This part is hand-coded, and any validation attributes I add work fine. 
/// </summary> 
public class WidgetMetadata 
{ 
     [System.ComponentModel.DefaultValue("Default Name")] 
     [StringLengthValidator(0, RangeBoundaryType.Inclusive, 320, RangeBoundaryType.Inclusive, Tag = "Invalid string length", MessageTemplate = "{1} must contain between \'{3}\' to \'{5}\' characters.")] 
     public string Name { get; set; } 
} 

Che cosa sto facendo di sbagliato ?, o non è supportato questo (e se così è documentato da nessuna parte?)

+2

Si prega di fornire un esempio di codice sorgente di minima vitale che presenta il problema. –

+0

Sì, non pensavo che qualcuno avrebbe capito senza una fonte. –

risposta

3

Aggiungi un costruttore per la classe WidgetMetaData e impostare il valore predefinito della proprietà lì. Lo DefaultValueAttribute viene utilizzato per Visual Studio Toolbox (credo) per determinare se il valore deve essere in grassetto (modificato) o meno (valore predefinito), tra le altre cose. Hai ancora bisogno di impostare il valore della proprietà ad un certo punto.

public WidgetMetaData() 
{ 
    Name = "Default Value"; 
} 

Maggiori informazioni sul DefaultValueAttribute: http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute(v=vs.71).aspx