Другая альтернатива, не очень эффективная, но дающая функциональность перечисления - использовать атрибут, например, такой:
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, но при этом иметь возможность показать красивое описание в пользовательском интерфейсе. Я не уверен, что это подходит для вашего случая, но предлагаю это как вариант.
Что касается ответа Мэтью, я предлагаю вам использовать 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; } }
}
Это возможно только косвенно, используя атрибуты для значений перечисления, например так:
public enum MyEnum {
[DefaultValue("en-gb")]
EnGb,
[DefaultValue("fa-ir")]
FaIr,
...
}
Затем вы можете получить строковое значение с помощью рефлексии, читая пользовательские атрибуты для статических полей перечисления.
Нет. Вы можете просто использовать Dictionary
. Тип для перечисления должен быть интегральным типом, отличным от char. Это необходимо для того, чтобы их можно было эффективно сравнивать.
Если все ваши имена/значения будут точно такими же, вы можете просто создать перечисление как обычно.
public enum MyEnum
{
EnGb
FaIr
}
А когда вам понадобится фактическое значение, получите имя перечисления в виде строки, сделайте его строчным и добавьте -
в середине.
string value = MyEnum.EnGb.ToString().ToLower().Insert(2, "-");