Что использовать, кроме перечисления для С#

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

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

Спасибо.

Ответ 1

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

Ответ 2

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

  • Мы украсили значения enum атрибутами [Description()], содержащими "дружественное имя" каждой константы перечисления.
  • Мы создали метод расширения GetDescription(), который бы отражал атрибут атрибута enum constant Description и возвращал дружественное имя. Если он не имеет одного, метод пытается вставить пробелы в ToString() имени константы перечисления. Поскольку константы перечисления CamelCased были требованиями стиля, применяемыми ReSharper, это работало около 90% наших констант, а атрибуты описания обрабатывали остальные (в основном аббревиатуры верхнего регистра в имени).
  • Мы создали универсальный метод расширения 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>()

EDIT: меня попросили использовать метод 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;

Ответ 3

Конструкция 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 }

    }

Там шаблон дизайна для этого, но я забыл имя.