Что использовать помимо enum для c # - PullRequest
10 голосов
/ 01 сентября 2010

Таким образом, в настоящее время перечисление используется в статусе приложения.Тем не менее, что-то чувствует себя плохо при использовании этого против пользовательского интерфейса.Для многих преобразований между целым числом и строкой при заполнении выпадающих списков.Я мог бы использовать метод расширения или преобразователь типов и продолжать использовать enum, который будет полезен, если в enum есть несколько слов.

Думаю, я бы попросил узнать о заполнении возможной дыры, прежде чем якопай вглубь.

Спасибо.

Ответы [ 3 ]

14 голосов
/ 01 сентября 2010

У моей команды была эта проблема в нашем недавнем проекте.Мы сохранили перечисления, потому что они используются для конечного списка известных значений констант, но мы сделали несколько вещей, чтобы сделать их более удобными для разработчика:

  1. Мы украсили значения перечисленияАтрибуты [Description ()], содержащие «понятное имя» каждой константы перечисления.
  2. Мы создали метод расширения GetDescription (), который бы рефлексивно проверял атрибут Description константы перечисления и возвращал понятное имя.Если его нет, метод пытается вставить пробелы в ToString () имени константы enum.Поскольку константы перечисления CamelCased были требованием к стилю, применяемым ReSharper, это работало для примерно 90% наших констант, а атрибуты Description обрабатывали остальное (в основном заглавные аббревиатуры в имени).
  3. Мы создали универсальный 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;
5 голосов
/ 01 сентября 2010

Если вы работаете с переменной, имеющей конечное и общеизвестное число возможных состояний, тогда enum - действительно правильная конструкция для использования.Есть много возможных способов сделать работу с пользовательским интерфейсом более удобной, и вы упомянули два превосходных - преобразователи типов и методы расширения.

0 голосов
/ 01 сентября 2010

Enum-подобная конструкция, безусловно, является правильным выбором.Если по какой-то причине вы не хотите использовать привычный встроенный способ, вы можете сделать себя более функциональным.вот основная идея:

class Country {
    private static Country US;
    private static Country JP

    static Country() { //initialize static variables }
    private Country( string name ) { //initialize variables of Country instance }

    }

Для этого есть шаблон дизайна, но я забыл название.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...