2014-04-10 7 views
5

Czy ktoś wie, jak uzyskać dostęp do adnotacji danych "Wyświetlana nazwa" typów wyliczeniowych?Adnotacja danych modułu encji "Wyświetlana nazwa" typu Enum

mam typu enum z wyświetlanymi nazwami

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

i klasę modelu, że odniesienia do niej

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

Jak mogę wyświetlić nazwę wyświetlania wartości w ModelClass?

Dzięki.

Odpowiedz

6

myślę szukasz czegoś takiego:

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

Lubię to, ale ja wciąż czekają na lepsze odpowiedzi –

1

Można użyć refleksji uzyskać dostęp do właściwości atrybutu:

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

można utworzyć rodzajowego metody pomocnika, który będzie odczytywać dane z tych atrybutów.

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; 
    } 

Przykład:

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

Jestem zaskoczony, nikt nie głosował tę odpowiedź w górę lub w górę, ale akceptuje to jako odpowiedź. –

Powiązane problemy