2014-04-10 7 views
5

Kann jemand auf die "Annotation Name" Daten Annotation von Enum-Typen zugreifen?Entity Framework Daten Annotation "Anzeigename" vom Typ Enum

Ich habe einen Aufzählungstyp mit Anzeigenamen

class enum SomethingType { 
    [Display(Name = "Type 1")] 
    Type1, 
    [Display(Name = "Type 2")] 
    Type2 
} 

und ein Modell-Klasse, die Verweise auf sie

class ModelClass { 
    public SomethingType Type {get; set;} 
} 

Wie kann ich die Anzeigenamen in ModelClass für die Werte angezeigt werden?

Danke.

Antwort

6

Ich glaube, Sie suchen nach etwas wie folgt aus:

class ModelClass 
{ 
    public SomethingType MyType {get; set;} 

    public string TypeName { 

     get 
     { 
      var enumType = typeof(SomethingType); 
      var field = enumType.GetFields() 
         .First(x => x.Name == Enum.GetName(enumType, MyType)); 

      var attribute = field.GetCustomAttribute<Display>(); 

      return attribute.Name; 
     } 

} 
+1

Ich mag dieses aber ich warte immer noch auf bessere Antworten –

1

Sie Reflektion verwenden könnte Eigenschaften des Attributs zuzugreifen:

Type = SomethingType.Type2; 

var memberInfo = Type.GetType().GetMember(Type.ToString()); 

if (memberInfo.Any()) 
{ 
    var attributes = memberInfo.First().GetCustomAttributes(typeof(DisplayAttribute), false); 
    if (attributes.Any()) 
    { 
     var name = ((DisplayAttribute)attributes.First()).Name; // Type 2 
    } 
} 
1

Sie können eine generische Hilfsmethode erstellen, die Daten lesen von diesen Attributen.

public static string GetAttributeValue<T>(this Enum e, Func<T, object> selector) where T : Attribute 
    { 

     var output = e.ToString(); 
     var member = e.GetType().GetMember(output).First(); 
     var attributes = member.GetCustomAttributes(typeof(T), false); 

     if (attributes.Length > 0) 
     { 
      var firstAttr = (T)attributes[0]; 
      var str = selector(firstAttr).ToString(); 
      output = string.IsNullOrWhiteSpace(str) ? output : str; 
     } 

     return output; 
    } 

Beispiel:

var x = SomethingType.Type1.GetAttributeValue<DisplayAttribute>(e => e.Name); 

.......

class ModelClass 
{ 
    public SomethingType Type { get; set; } 

    public string TypeName 
    { 
     get { return Type.GetAttributeValue<DisplayAttribute>(attribute => attribute.Name); } 
    } 
} 
+1

Ich bin überrascht, niemand diese Antwort gewählt hat up oder besser noch akzeptiert es als Antwort. –