从ENUM创建列表到模型

时间:2011-10-23 21:25:25

标签: asp.net-mvc model-view-controller asp.net-mvc-2 c#-3.0

我得到了以下模型代码:

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

我有一个Enum,我想用枚举值填充我的变量CODE,并使用相同的枚举描述填充变量Description。我查了很长时间,但未能使用枚举值VALUE / DESCRIPTION将我的“ListFields”初始化为其构造函数。

我已经获得了enum和方法来获取它的描述..我发现它很有用,所以我会留在这里,也许它对某人有用..

 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 个答案:

答案 0 :(得分: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时,使用字段名称。

我们还必须说,反射可能很慢并且在需要时重建整个阵列是浪费时间,如果你经常需要的话。 您可以将数组存储在某个位置,这样您只能计算一次并保持缓存。 当然,正如我所说的那样,只有在经常需要这个只读列表时才有意义。