Делаем enumeration с текстовым описанием
Я часто сталкиваюсь с ситуациями, когда для enum желательно иметь некоторое текстовое описание, но как вы знаете, enum не позволяет этого делать. Поэтому рассмотрим, как можно обойти эту проблему.
Пусть у нас есть некий enumaration:
enum Cars
{
Volvo,
Mercedes,
Lada,
Mazda,
Toyota
}
для элементов которого мы собственно и хотим добавить текстовые описания.
Описания мы будем помещать в custom attributes, поэтому создадим класс EnumDescriptionAttribute, который унаследуем от класса Attribute.
Класс будет выглядеть следующим образом:
class EnumDescriptionAttribute : Attribute
{
public string StringValue { get; protected set; }
public EnumDescriptionAttribute(string value)
{
this.StringValue = value;
}
}
Теперь мы можем добавить атрибут EnumDescription для нашего перечисления:
enum Cars
{
[EnumDescription("Volvo is a cool car!")]
Volvo,
[EnumDescription("Mercedes is a very cool car!")]
Mercedes,
[EnumDescription("If you have no Mercedes or Volvo then Lada is a cool car!!")]
Lada,
[EnumDescription("Mazda is also a cool car!!")]
Mazda,
[EnumDescription("Toyota is also a cool car!!")]
Toyota
}
Добавить то мы добавили, но там же еще нужно и прочитать!
Поэтому создадим extension метод GetStringValue, который и будет читать наше описание. Для создания extension метода нам нелбходимо создать статический класс, к примеру ExtentionUtils и реализовать логику чтения описания:
static class ExtentionUtils
{
public static string GetStringValue(this Enum value)
{
// Get the type
Type type = value.GetType();
// Get fieldinfo for this type
FieldInfo fieldInfo = type.GetField(value.ToString());
// Get the stringvalue attributes
EnumDescriptionAttribute[] attribs = fieldInfo.GetCustomAttributes(
typeof(EnumDescriptionAttribute), false) as EnumDescriptionAttribute[];
// Return the first if there was a match.
return attribs.Length > 0 ? attribs[0].StringValue : null;
}
}
Так как это extension метод, то получить описание элемента перечисления можно с помощью такого кода:
string volvoDescription = Cars.Volvo.GetStringValue();
Вот и все! Пользуйтесь.