представьте в виде строки оценивает перечисление в c# [дубликат]

9
задан abatishchev 23 April 2011 в 08:31
поделиться

5 ответов

Другая альтернатива, не очень эффективная, но дающая функциональность перечисления - использовать атрибут, например, такой:

public enum MyEnum
{
  [Description("en-gb")]
  EnGb,
  [Description("fa-ir")]
  FaIr,
  ...
}

И что-то вроде метода расширения, вот что я использую:

public static string GetDescription<T>(this T enumerationValue) where T : struct
{
  var type = enumerationValue.GetType();
  if (!type.IsEnum) throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
  var str = enumerationValue.ToString();
  var memberInfo = type.GetMember(str);
  if (memberInfo != null && memberInfo.Length > 0)
  {
    var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
    if (attrs != null && attrs.Length > 0)
      return ((DescriptionAttribute) attrs[0]).Description;
  }
  return str;
}

Затем вы можете вызвать его так:

MyEnum.EnGb.GetDescription()

Если у него есть атрибут description, вы получите его, если нет, вы получите версию .ToString(), например, "EnGb". Причина, по которой у меня есть нечто подобное, заключается в том, чтобы использовать тип enum непосредственно в объекте Linq-to-SQL, но при этом иметь возможность показать красивое описание в пользовательском интерфейсе. Я не уверен, что это подходит для вашего случая, но предлагаю это как вариант.

13
ответ дан 4 December 2019 в 08:32
поделиться

Что касается ответа Мэтью, я предлагаю вам использовать Dictionary. Я использую его как статическое свойство:

class MyClass
{
    private static readonly IDictionary<MyEnum, String> dic = new Dictionary<MyEnum, String>
    {
        { MyEnum.EnGb, "en-gb" },
        { MyEnum.RuRu, "ru-ru" },
        ...
    };

    public static IDictionary<MyEnum, String> Dic { get { return dic; } }
}
7
ответ дан 4 December 2019 в 08:32
поделиться

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

public enum MyEnum {
  [DefaultValue("en-gb")]
  EnGb,
  [DefaultValue("fa-ir")]
  FaIr,
  ...
}

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

1
ответ дан 4 December 2019 в 08:32
поделиться

Нет. Вы можете просто использовать Dictionary. Тип для перечисления должен быть интегральным типом, отличным от char. Это необходимо для того, чтобы их можно было эффективно сравнивать.

1
ответ дан 4 December 2019 в 08:32
поделиться

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

public enum MyEnum
{
   EnGb
   FaIr
}

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

string value = MyEnum.EnGb.ToString().ToLower().Insert(2, "-");
3
ответ дан 4 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: