У моей команды была эта проблема в нашем недавнем проекте.Мы сохранили перечисления, потому что они используются для конечного списка известных значений констант, но мы сделали несколько вещей, чтобы сделать их более удобными для разработчика:
- Мы украсили значения перечисленияАтрибуты [Description ()], содержащие «понятное имя» каждой константы перечисления.
- Мы создали метод расширения GetDescription (), который бы рефлексивно проверял атрибут Description константы перечисления и возвращал понятное имя.Если его нет, метод пытается вставить пробелы в ToString () имени константы enum.Поскольку константы перечисления CamelCased были требованием к стилю, применяемым ReSharper, это работало для примерно 90% наших констант, а атрибуты Description обрабатывали остальное (в основном заглавные аббревиатуры в имени).
- Мы создали универсальный ParseEnum ()метод расширения для строк, который в основном обёртывает Enum.Parse () (что является oogly; требует указания типа Enum в методе и последующего приведения к нему).Я думаю, что это может быть достаточно разумно, чтобы сначала попытаться найти атрибуты описания, иначе мы просто используем все еще читаемое представление ToString () в качестве значения данных раскрывающегося элемента.
Итак,учитывая следующее:
public enum MyItems
{
[Description("Item One")]
ItemOne,
[Description("Item Two")]
ItemTwo,
[Description("Item Three")]
ItemThree
}
мы могли бы заполнить DropDownList удобными для пользователя вариантами в две строки:
foreach(MyValues value in Enum.GetValues<MyValues>())
myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString())
... и затем мы могли бы проанализировать выборку с оченьчитаемый код:
var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>()
РЕДАКТИРОВАТЬ: меня попросили метод GetDescription ().Я немного сомневаюсь в том, чтобы делиться всем этим, но вот основной алгоритм получения атрибута Description, который украшает константу enum.Разбор имени CamelCased довольно прост. RegEx разбивается на заглавные буквы, и наша реализация в любом случае немного наивна.Этот фрагмент требует System.ComponentModel.DescriptionAttribute (который также является декоратором для констант перечисления), а enumType является параметром "this" метода расширения типа Enum:
var attr = enumType.GetType().GetField(enumType.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attr.Length > 0)
return ((DescriptionAttribute)attr[0]).Description;