суббота, 9 августа 2008 г.

Вывод "человеческих" имен Enum с помощью Extension Metods

В прошлом году я писал как можно реализовать вывод пользователю не внутренних имен перечислений (Enum'ов), а более человеческих, причем привязать эти самые человеческие имена к самим перечислениям.

Сегодня, вооружась новыми технологиями, я расскажу как можно сделать то же самое используя методы-расширения (Extension Metods).

Во-первых, нам понадобится следующий код:

[AttributeUsage(AttributeTargets.Field)]
public class EnumDescriptionAttribute: Attribute
{
    public readonly string description;

    public EnumDescriptionAttribute(string description)
    {
        this.description = description;
    }
}

public enum etest
{
    [EnumNameAttribute("Значение 1")]
    value1,
    [EnumNameAttribute("Значение 2")]
    value2,
    …
}
Здесь мы определяем атрибут, который отвечает за человеческие имена элементов перечисления и, собственно, само перечисление, которое мы и будем выводить пользователю. Нам понадобится вот такой класс:


public static class Specials
{
        public static string GetHumanName(this Enum p)
        {
            return ((EnumNameAttribute)p.GetType().GetField(p.ToString()).GetCustomAttributes(typeof(EnumNameAttribute), true)[0]).name;
        }
}
И теперь в нашем коде мы можем писать вот так:

Console.WriteLine(etest.value1.GetHumanName());
что на мой взгляд намного удобнее кода вида:

Console.WriteLine(Specials.GetHumanName(etest.value1));
Хотя, конечно, без "Правая кнопка мыши->Go To Definition" понять откуда у Enum'ов взялась функция GetHumanName будет сложновато :)

Комментариев нет:

Отправить комментарий