Создание списка из ENUM в модель - PullRequest
1 голос
/ 24 октября 2011

Я получил следующий код модели:

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 значением enum, а переменную Description - тем же описанием enum. Я долго искал и не смог инициализировать мои «ListFields» в его конструктор с помощью enum 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 Ответ

1 голос
/ 24 октября 2011

Вы должны использовать отражение.

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

В моей реализации, когда атрибут description не найден, используется имя поля.

Мы также должны сказать, что отражение может быть медленным, и перестройка всего массива, когда вам это нужно, - пустая трата времени, если вам это нужно часто.Вы можете хранить массив где-нибудь, чтобы вычислить его только один раз и сохранить в кэше.Это, конечно, и, как я уже сказал, имеет смысл, только если вам нужен этот список только для чтения очень часто.

...