2015-01-15 5 views
3

У меня есть следующие перечисления:Как получить список значений и описаний перечисления?

public enum AlertSeverity 
    { 
     [Description("Informative")] 
     Informative = 1, 

     [Description("Low risk")] 
     LowRisk = 2, 

     [Description("Medium risk")] 
     MediumRisk = 3, 

     [Description("High risk")] 
     HighRisk = 4, 

     Critical = 5 
    } 

, и я хочу, чтобы получить List<KeyValuePair<string, int>> всех описаний/имен и значений, поэтому я пытался что-то вроде этого:

public static List<KeyValuePair<string, int>> GetEnumValuesAndDescriptions<T>() where T : struct 
    { 
     var type = typeof(T); 
     if (!type.IsEnum) 
      throw new InvalidOperationException(); 
     List<KeyValuePair<string, int>> lst = new List<KeyValuePair<string, int>>(); 
     foreach (var field in type.GetFields()) 
     { 
      var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; // returns null ??? 
      if (attribute != null) 
       lst.Add(new KeyValuePair<string, int>(attribute.Description, ((T)field.GetValue(null)).ToInt())); 
      else 
       lst.Add(new KeyValuePair<string, int>(field.Name, ((T)field.GetValue(null)).ToInt())); // throws exception: "Non-static field requires a target" ??? 
     } 
     return lst; 
    } 

Я не знать, почему, но атрибут var возвращает значение null и поле. Исключение исключений «Нестатическое поле требует цели»

ответ

6

Это должно работать:

public static List<KeyValuePair<string, int>> GetEnumValuesAndDescriptions<T>() 
     { 
      Type enumType = typeof (T); 

      if (enumType.BaseType != typeof(Enum)) 
       throw new ArgumentException("T is not System.Enum"); 

      List<KeyValuePair<string, int>> enumValList = new List<KeyValuePair<string, int>>(); 

      foreach (var e in Enum.GetValues(typeof(T))) 
      { 
       var fi = e.GetType().GetField(e.ToString()); 
       var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

       enumValList.Add(new KeyValuePair<string, int>((attributes.Length > 0) ? attributes[0].Description : e.ToString(), (int)e)); 
      } 

      return enumValList; 
     } 
+0

Он отлично работает, спасибо большое :) –

Смежные вопросы