Добавление описания к перечислениям (Enumerations) C#
Перечисления позволяют объявлять в группе несколько констант. Эти константы предоставляют имена числовым значениям, чтобы упростить чтение и обслуживание кода. Имена не идеально отформатированы для отображения пользователям, но их можно дополнить описаниями.
Перечисления
C# позволяет объявлять константы и перечисления. Константы позволяют давать имена фиксированным значениям различных типов. Перечисление определяет ряд связанных констант для числовых значений, каждая из которых имеет уникальное имя. Это может повысить читабельность кода, так как имена констант могут быть самодокументируемыми. Однако, поскольку имена значений перечисления должны соответствовать стандартам для идентификаторов C#, они не всегда подходят для вывода. Это наиболее очевидно при работе с константами, объединяющими два или более слова, поскольку пробелы, знаки препинания или другие специальные символы не допускаются.
Отдельным константам в перечислении могут быть даны описания, которые более подходят для отображения пользователю. В этой статье мы создадим перечисление, украшенное атрибутами Описания. Затем мы создадим метод расширения, который использует отражение для получения описания и возвращает его в виде строки. Если вы используете версию.NET framework, который не поддерживает методы расширения, вы можете преобразовать, используя вместо этого стандартный статический метод.
Атрибут Description
Атрибут Description может быть применен к каждой из констант в перечислении. Он находится в пространстве имен System.ComponentModel, поэтому добавьте следующую директиву using для упрощения кода.
using System.ComponentModel;Теперь мы можем создать перечисление, используя стандартный синтаксис. Удобный для пользователя текст для каждого значения предоставляется единственному параметру атрибута Description. Добавьте следующий код в свой тестовый проект. Значения определяют несколько основных цветов и некоторые описательные названия, которые могут использоваться производителем автомобилей. Обратите внимание, что последнее значение, "Красный", не имеет описания. Это позволит нам проверить, работает ли метод с элементами, у которых нет атрибута.
enum CarColour { [Description("Белое мороженое")] White, [Description("Черный карбон ")] Black, [Description("Серебро")] Silver, Red }Создание метода расширения
Метод расширения будет использовать отражение для проверки значений в любом перечислении и поиска атрибута Description. При наличии его, Description будет возвращен. Если описание отсутствует, вместо него будет возвращено имя константы. Чтобы упростить код, использующий отражение, добавьте следующую директиву using:
using System.Reflection;Теперь мы можем создать метод следующим образом:
public static class EnumExtensions { public static string Description(this Enum enumValue) { var enumType = enumValue.GetType(); var field = enumType.GetField(enumValue.ToString()); var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false); return attributes.Length == 0 ? enumValue.ToString() : ((DescriptionAttribute)attributes[0]).Description; } }Метод выполняет несколько действий. В первой строке метода указывается тип перечисления. Это необходимо, так как метод расширения будет работать с любым перечислением, а не только с цветами. Затем вызывается метод GetField, передающий имя значения перечисления, указанного в параметре метода. Это позволяет получить информацию о поле для значения.
Третий шаг вызывает метод GetCustomAttributes объекта информации о поле. Поскольку указан тип атрибута Описания, этот вызов возвращает любой атрибут описания, определенный для значения. Результаты возвращаются в виде массива объектов. Последняя строка проверяет, существуют ли какие-либо элементы в этом массиве. Если массив пуст, возвращается метод toString значения. Это дает имя константе. Если в массиве есть значение, оно преобразуется в атрибут DescriptionAttribute и возвращается свойство Description. Это текст, определенный в атрибуте.
Тестирование метода расширения
Чтобы протестировать метод, мы можем перебрать все константы в перечислении и вывести возвращаемое значение метода Description для каждого элемента следующим образом. Обратите внимание, что последний элемент, у которого нет описания, возвращает имя константы.
for (CarColour cc = CarColour.White; cc <= CarColour.Red; cc++) { Console.WriteLine(cc.Description()); }
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.