Utilizzando il DefaultValueAttribute su una classe che viene utilizzata come tipo in un MetadataTypeAttribute

StackOverflow https://stackoverflow.com/questions/4741909

  •  12-10-2019
  •  | 
  •  

Domanda

Ho usato l'attributo MetadataType per aggiungere attributi di validazione alle classi che sto generando utilizzando un modello T4. Questo funziona meravigliosamente, ma mi piacerebbe essere in grado di utilizzare l'attributo DefaultValue su alcune proprietà, in modo che la mia classe MetadataType descriverà in modo più completo le mie classi (e in modo che non avrò per implementare il metodo OnCreated in quelle classi) . Posso aggiungere l'attributo alla mia classe MetadataType, ma non ha alcun effetto.

Ecco qualche fonte esempio - la parte generata è (ovviamente) in un file diverso. Se io un'istanza di un oggetto Widget, la proprietà Name sarà nullo.

/// <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 è questo non supportato (e se così è documentata da nessuna parte?)

È stato utile?

Soluzione

Add a constructor to the WidgetMetaData class and set the default value of the property there. The DefaultValueAttribute is used for the Visual Studio Toolbox (I believe) to determine whether the value should be bold (changed) or not (default value), among other things. You still need to set the value of the property at some point.

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

More information on the DefaultValueAttribute: http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute(v=vs.71).aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top