Делаем enumeration с текстовым описанием

воскресенье, 22 марта 2009, Александр Краковецкий

Я часто сталкиваюсь с ситуациями, когда для 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();

Вот и все! Пользуйтесь.


Ищите нас в интернетах!

Комментарии

Свежие вакансии