В интернет много примеров использования System.ComponentModel.DescriptionAttribute для описания значения enum, данное решение применимо, когда у вас есть доступ к исходным кодам описания enum. Но, если enum содержится во внешней библиотеке, то сделать ничего нельзя (ну как минимум, я не знаю, как установить значение атрибута для внешней библиотеки). Поэтому был реализован набор extension методов обеспечивающих и расширяющих данную функциональность.
Если дальше скучно, то исходники можно скачать тут
Реализация
Было принято решение расширить функциональность и кроме использования DescriptionAttribute и DisplayAttribute (свойства Name и Description) еще использовать дополнительные аттрибуты (можно потом их доработать до поддержки локализации):
Т.е. функциональность будет поддерживать четыре типа аттрибутов DescriptionAttribute, DisplayAttribute, EnumDescriptionAttribute и EnumDisplayNameAttribute.
EnumDescriptionAttribute планируется использовать для развернутого описания значения enum, например для отображения в ToolTip. EnumDisplayName - для краткого описания значения и может использоваться например в ListBox.
Приоритеты использования значения атрибутов: Description = EnumDescriptionAttribute || DescriptionAttribute || DisplayAttribute.Description, DisplayName = EnumDisplayNameAttribute || DisplayAttribute.Name.
Если ни один атрибут не был установлен, то значения DisplayName и Description устанавливаются в значение по умолчанию, равному значению enum.ToString()
Для поддержания работы в момент исполнения и для работы со сторонними библиотеками в классе EnumExtensions создается статическая коллекция информации о используемых типах enum, заполняемая по мере необходимости и используемая в качестве cache.
Каждый из extension методов получает информацию о переданном типе enum из внутренней коллекции и возвращает необходимую информацию.
Реализованы следующие extension методы:
Ограничения
К сожалению, есть некоторые ограничения, а именно: используемый enum не может иметь два значения с разными символьными именами, но одинаковыми числовыми значениями.
Использование
Использование атрибутов
Для проверки функциональности атрибутов создадим два простейших enum
И создадим простейшее консольное приложение
Результаты работы
Установка значений в момент исполнения
Результаты исполнения
Исходники можно скачать тут
Задача
Разработать набор extension методов для реализации функциональности установки и получения описания значения enum, как с помощью атрибутов, так и в момент исполнения.Если дальше скучно, то исходники можно скачать тут
Реализация
Было принято решение расширить функциональность и кроме использования DescriptionAttribute и DisplayAttribute (свойства Name и Description) еще использовать дополнительные аттрибуты (можно потом их доработать до поддержки локализации):
Т.е. функциональность будет поддерживать четыре типа аттрибутов DescriptionAttribute, DisplayAttribute, EnumDescriptionAttribute и EnumDisplayNameAttribute.
EnumDescriptionAttribute планируется использовать для развернутого описания значения enum, например для отображения в ToolTip. EnumDisplayName - для краткого описания значения и может использоваться например в ListBox.
Приоритеты использования значения атрибутов: Description = EnumDescriptionAttribute || DescriptionAttribute || DisplayAttribute.Description, DisplayName = EnumDisplayNameAttribute || DisplayAttribute.Name.
Если ни один атрибут не был установлен, то значения DisplayName и Description устанавливаются в значение по умолчанию, равному значению enum.ToString()
Для поддержания работы в момент исполнения и для работы со сторонними библиотеками в классе EnumExtensions создается статическая коллекция информации о используемых типах enum, заполняемая по мере необходимости и используемая в качестве cache.
Каждый из extension методов получает информацию о переданном типе enum из внутренней коллекции и возвращает необходимую информацию.
Реализованы следующие extension методы:
Имя метода | Возвращаемый тип данных | Параметры | Описание |
---|---|---|---|
GetDescription() | string | Получение Description для enum, если enum Flag а значение множественное, то в качестве разделителя будет ', ' | |
GetDescription(string separator) | string | separator - разделитель для Flag enum | Получение Description с прямым указанием разделителя для Flag enum |
SetDescription(string description) | void | description - устанавливаемое значение Description | Установка Description для определенного значения enum |
GetDescriptions() | IEnumerable<KeyValuePair<dynamic, string>> | Получение списка пар: Числовое значение enum, Description | |
GetDisplayName() | string | Получение DisplayName для enum, если enum Flag а значение множественное, то в качестве разделителя будет ', ' | |
GetDisplayName(string separator) | string | separator - разделитель для Flag enum | Получение DisplayName с прямым указанием разделителя для Flag enum |
SetDisplayName(string displayName) | void | displayName - устанавливаемое значение DisplayName | Установка DisplayName для определенного значения enum |
GetDisplayNames() | IEnumerable<KeyValuePair<dynamic, string>> | Получение списка пар: Числовое значение enum, DisplayName | |
IsDefined | bool | Проверка принадлежности значения enum к его типу |
Ограничения
К сожалению, есть некоторые ограничения, а именно: используемый enum не может иметь два значения с разными символьными именами, но одинаковыми числовыми значениями.
Использование
Использование атрибутов
Для проверки функциональности атрибутов создадим два простейших enum
И создадим простейшее консольное приложение
Результаты работы
Установка значений в момент исполнения
Результаты исполнения
Исходники можно скачать тут
Комментариев нет :
Отправить комментарий