Страницы

суббота, 1 июня 2013 г.

Enum extension методы для работы с DescriptionAttribute

В интернет много примеров использования System.ComponentModel.DescriptionAttribute для описания значения enum, данное решение применимо, когда у вас есть доступ к исходным кодам описания enum. Но, если enum содержится во внешней библиотеке, то сделать ничего нельзя (ну как минимум, я не знаю, как установить значение атрибута для внешней библиотеки). Поэтому был реализован набор extension методов обеспечивающих и расширяющих данную функциональность.


Задача
Разработать набор 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
И создадим простейшее консольное приложение
Результаты работы
Установка значений в момент исполнения
Результаты исполнения

Исходники можно скачать тут

Комментариев нет :

Отправить комментарий