Ключевое слово enum в языке C# используется для объявления перечисления — отдельного типа, который состоит из набора именованных констант, называемого списком перечислителей. Enum существенно повышает удобочитаемость кода, позволяя избавиться от «магических переменных». Но при выводе значения пользователю возникает необходимость отображать значения в более удобочитаемом формате или на другом языке. Рассмотрим один из вариантов отображения значения enum на русском языке с использованием атрибутов.

Для начала создадим перечисление. В качестве тестового примера будем использовать перечисление из 5 элементов состоящих из цифр от 1 до 5. Обратите внимание, что для того, чтобы использовать атрибут Description необходимо подключить пространство имен using System.ComponentModel;

/// <summary>
/// Числа.
/// </summary>
public enum Numbers : int
{
	/// <summary>
	/// Один.
	/// </summary>
	[Description("Один")]
	One = 1,
	/// <summary>
	/// Два.
	/// </summary>
	[Description("Два")]
	Two = 2,
	/// <summary>
	/// Три.
	/// </summary>
	[Description("Три")]
	Three = 3,
	/// <summary>
	/// Четыре.
	/// </summary>
	[Description("Четыре")]
	Four = 4,
	/// <summary>
	/// Пять.
	/// </summary>
	[Description("Пять")]
	Five = 5
}

Теперь нам необходимо создать метод, который будет получать значение из атрибута Description. Обратите внимание, что для корректной работы данного метода необходимо подключить еще одну библиотеку using System.Reflection; Выглядеть он будет следующим образом:

/// <summary>
/// Приведение значения перечисления в удобочитаемый формат.
/// </summary>
/// <remarks>
/// Для корректной работы необходимо использовать атрибут [Description("Name")] для каждого элемента перечисления.
/// </remarks>
/// <param name="enumElement">Элемент перечисления</param>
/// <returns>Название элемента</returns>
static string GetDescription(Enum enumElement)
{
	Type type = enumElement.GetType();

	MemberInfo[] memInfo = type.GetMember(enumElement.ToString());
	if (memInfo != null && memInfo.Length > 0)
	{
		object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
		if (attrs != null && attrs.Length > 0)
			return ((DescriptionAttribute)attrs[0]).Description;
	}

	return enumElement.ToString();
}

И как результат нам остается взывать наш метод для проверки корректности его работы. Для сравнения будем использовать различные методы приведения перечисления.

static void Main(string[] args)
{
	Console.WriteLine(Numbers.One);
	Console.WriteLine((int)Numbers.Two);
	Console.WriteLine(Numbers.Three.ToString());
	Console.WriteLine(GetDescription(Numbers.Four));
	Console.ReadLine();
}

Запустим программу и получим следующий результат:

Enum result

Enum result

При желании данный метод можно переписать в форме метода расширения. Тогда его сигнатура будет выглядеть следующим образом:

public static string GetDescription(this Enum enumElement)

Ну а соответственно использование изменится на такой формат:

Console.WriteLine(Numbers.Four.GetDescription());

Полный код проекта можно найти на сайте по ссылке https://github.com/shwanoff/EnumDescription

 
Рубрики: C#

shwan

Программист .NET

×
%d такие блоггеры, как: