Ключевое слово enum в языке C# используется для объявления перечисления — отдельного типа, который состоит из набора именованных констант, называемого списком перечислителей. Enum существенно повышает удобочитаемость кода, позволяя избавиться от «магических переменных». Но при выводе значения пользователю возникает необходимость отображать значения в более удобочитаемом формате или на другом языке. Рассмотрим один из вариантов отображения значения enum на русском языке с использованием атрибутов.
Для начала создадим перечисление. В качестве тестового примера будем использовать перечисление из 5 элементов состоящих из цифр от 1 до 5. Обратите внимание, что для того, чтобы использовать атрибут Description необходимо подключить пространство имен using System.ComponentModel;
/// <summary> /// Числа. /// </summary> public enum Numbers : int { /// <summary> /// Один. /// </summary> [Description("Один")] One = 1, /// <summary> /// Два. /// </summary> [Description("Два")] Two = 2, /// <summary> /// Три. /// </summary> [Description("Три")] Three = 3, /// <summary> /// Четыре. /// </summary> [Description("Четыре")] Four = 4, /// <summary> /// Пять. /// </summary> [Description("Пять")] Five = 5 }
Теперь нам необходимо создать метод, который будет получать значение из атрибута Description. Обратите внимание, что для корректной работы данного метода необходимо подключить еще одну библиотеку using System.Reflection; Выглядеть он будет следующим образом:
/// <summary> /// Приведение значения перечисления в удобочитаемый формат. /// </summary> /// <remarks> /// Для корректной работы необходимо использовать атрибут [Description("Name")] для каждого элемента перечисления. /// </remarks> /// <param name="enumElement">Элемент перечисления</param> /// <returns>Название элемента</returns> static string GetDescription(Enum enumElement) { Type type = enumElement.GetType(); MemberInfo[] memInfo = type.GetMember(enumElement.ToString()); if (memInfo != null && memInfo.Length > 0) { object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); if (attrs != null && attrs.Length > 0) return ((DescriptionAttribute)attrs[0]).Description; } return enumElement.ToString(); }
И как результат нам остается взывать наш метод для проверки корректности его работы. Для сравнения будем использовать различные методы приведения перечисления.
static void Main(string[] args) { Console.WriteLine(Numbers.One); Console.WriteLine((int)Numbers.Two); Console.WriteLine(Numbers.Three.ToString()); Console.WriteLine(GetDescription(Numbers.Four)); Console.ReadLine(); }
Запустим программу и получим следующий результат:

При желании данный метод можно переписать в форме метода расширения. Тогда его сигнатура будет выглядеть следующим образом:
public static string GetDescription(this Enum enumElement)
Ну а соответственно использование изменится на такой формат:
Console.WriteLine(Numbers.Four.GetDescription());
Полный код проекта можно найти на сайте по ссылке https://github.com/shwanoff/EnumDescription