Сегодня, вооружась новыми технологиями, я расскажу как можно сделать то же самое используя методы-расширения (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 будет сложновато :)
Комментариев нет:
Отправить комментарий