Как получить описание C # Enum из значения?

Возможный дубликат:
Получение атрибутов значения Enum

У меня есть перечисление с атрибутами описания, например:

public enum MyEnum { Name1 = 1, [Description("Here is another")] HereIsAnother = 2, [Description("Last one")] LastOne = 3 } 

Я нашел этот бит кода для получения описания на основе Enum

 public static string GetEnumDescription(Enum value) { FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) return attributes[0].Description; else return value.ToString(); } 

Это позволяет мне писать код типа:

 var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum)) select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) }; 

Я хочу сделать, если я знаю значение enums (например, 1) – как я могу получить описание? Другими словами, как преобразовать целое число в значение «Enum», чтобы перейти к моему методу GetDescription?

 int value = 1; string description = Enumerations.GetEnumDescription((MyEnum)value); 

Основной тип данных по умолчанию для enum в C # – это int , вы можете просто бросить его.

Я реализовал это в универсальном, безопасном для типов способом в Unconstrained Melody – вы бы использовали:

 string description = Enums.GetDescription((MyEnum)value); 

Эта:

  • Обеспечивает (с ограничениями общего типа), что значение действительно является значением enums
  • Избегает бокса в вашем текущем решении
  • Кэширует все описания, чтобы избежать использования отражения при каждом вызове
  • Имеет множество других методов, в том числе возможность анализировать значение из описания

Я понимаю, что основным ответом был просто MyEnum из int в MyEnum , но если вы делаете много работы enum, стоит подумать об использовании Unconstrained Melody 🙂

Я поместил код из принятого ответа в общий метод расширения, поэтому он может использоваться для всех видов объектов:

 public static string DescriptionAttr(this T source) { FieldInfo fi = source.GetType().GetField(source.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) return attributes[0].Description; else return source.ToString(); } 

Используя перечисление, как в исходном сообщении, или любой другой class, свойство которого украшено атрибутом Description, код может быть использован следующим образом:

 string enumDesc = MyEnum.HereIsAnother.DescriptionAttr(); string classDesc = myInstance.SomeProperty.DescriptionAttr(); 

Чтобы сделать это проще в использовании, я написал общее расширение:

 public static string ToDescription(this TEnum EnumValue) where TEnum : struct { return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue)); } 

теперь я могу написать:

  MyEnum my = MyEnum.HereIsAnother; string description = my.ToDescription(); System.Diagnostics.Debug.Print(description); 

Примечание: замените «Перечисления» выше на ваше имя classа

Вы не можете легко сделать это в общем виде: вы можете преобразовать целое число в определенный тип enums. Как показал Николас, это тривиальный бросок, если вы только заботитесь об одном виде enums, но если вы хотите написать общий метод, который может обрабатывать различные виды перечислений, все становится немного сложнее. Вам нужен метод в соответствии с:

 public static string GetEnumDescription(int value) { return GetEnumDescription((Enum)((TEnum)value)); // error! } 

но это приводит к ошибке компилятора, которая «int не может быть преобразована в TEnum» (и если вы обойдете это, то «TEnum не может быть преобразован в Enum»). Поэтому вам нужно обмануть компилятор, вставив приведение в объект:

 public static string GetEnumDescription(int value) { return GetEnumDescription((Enum)(object)((TEnum)(object)value)); // ugly, but works } 

Теперь вы можете вызвать это, чтобы получить описание любого типа enums:

 GetEnumDescription(1); GetEnumDescription(2); 
  • Метод расширения для enums, а не экземпляр enums
  • Как я могу просмотреть перечисление Java из его значения String?
  • Можно ли использовать Swift's Enum в Obj-C?
  • Использование вложенных типов перечислений в Java
  • В чем преимущество переименования Java в сравнении с classом с публичными статическими конечными полями?
  • Могу ли я указать порядковый номер для enums в Java?
  • Использовать перечисление в h: selectManyCheckbox
  • Что такое тильда (~) в определении enums?
  • Как я могу расширить лексический бросок, чтобы поддерживать перечисленные типы?
  • Преимущества enums Java над старым шаблоном «Typesafe Enum»?
  • Java перечисляет элементы с пробелами?
  • Interesting Posts
    Давайте будем гением компьютера.