2011-10-23 99 views
1

我得到了下面的代碼車型資料片:創建從ENUM列表分爲模型

public enum EnumTest 
{ 
    [Description ("Enum Text 1")] 
    Value_1 = 1, 

    [Description ("Enum Text 2")] 
    Value_2 = 2, 
} 

public List<Fields> listFields = new List<Fields>(); 

public class Fields 
{ 
    public int Code { get; set;} 
    public string Description { get; set;} 
} 

我得到了一個枚舉,我想,以填補我的變量代碼枚舉值和變量說明用相同的枚舉描述。我查了很久,並沒有初始化我的「ListFields」到它的構造函數枚舉VALUE/DESCRIPTION。

我已經得到了枚舉和方法,以獲取其描述。我發現它有用的,所以我會離開這裏,也許它可能是有用的人..

public static string GetDescription(this Enum value) 
{ 
    return (from m in value.GetType().GetMember(value.ToString()) 
      let attr =(DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() 
      select attr == null ? value.ToString() : attr.Description).FirstOrDefault(); 
    } 

要使用此你只需要做這樣的事情:

String xx = Enum.EnumName.GetDescription(); 

回答

1

你必須使用反射。

public static Fields[] GetEnumFields(Type enumType) 
    { 
     if (enumType == null) 
      throw new ArgumentNullException("enumType"); 
     if (!enumType.IsEnum) 
      throw new ArgumentException("Not an enum"); 

     FieldInfo[] fieldInfos = enumType.GetFields(BindingFlags.Static | BindingFlags.Public); 

     Fields[] result = new Fields[fieldInfos.Length]; 
     for (int i = 0; i < fieldInfos.Length; ++i) 
     { 
      FieldInfo field = fieldInfos[i]; 

      int value = (int)field.GetValue(null); 

      DescriptionAttribute attrib = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
      string desc = attrib != null ? attrib.Description : field.Name; 

      result[i] = new Fields(value, desc); 
     } 

     return result; 
    } 

    public class Fields 
    { 
     private int value; 
     private string description; 

     public int Value 
     { 
      get { return this.value; } 
     } 

     public string Description 
     { 
      get { return this.description; } 
     } 

     public Fields(int value, string description) 
     { 
      this.value = value; 
      this.description = description; 
     } 
    } 

要使用它很簡單:

enum test 
    { 
     [Description("hello!")] 
     ciao, 

     www 
    } 

    static void Main(string[] args) 
    { 
     foreach (Fields f in GetEnumFields(typeof(test))) 
     { 
      Console.WriteLine(f.Description); 
     } 
    } 

我在執行時沒有找到descriptionattribute,使用字段名。

我們還必須說,如果您經常需要它,反射可能會很慢,並且在需要時重建整個陣列是浪費時間。 您可以將數組存儲在某個位置,以便只計算一次並保存它。 這當然,正如我所說,只有當你經常需要這個只讀列表時纔有意義。

+0

偉大的解決方案,隊友!像魅力一樣工作..是否很難讓它返回任何數組?我有一堆可以使用你發佈的方法的代碼。我不會適用於「Fields」集合。 –

+0

對不起,我不明白這個問題。你什麼意思?如你所說,這個函數返回一個Fields類的數組,你希望它返回什麼? –

+0

什麼是描述或值的數組?或? –