Перечисления

Перечисления (enum) представляют собой объединение в одной сущности сходных по смыслу целочисленных констант.

Например, мы могли бы держать в программе несколько констант для обозначения версии операционной системы на которой запущена наша программа:

const int WIN7 = 0;
const int WIN10 = 1;

Вместо этого удобней использовать перечисление. Перечисления в общем виде объявляются следующим образом:

enum имя_перечисления {
    символьное_имя_1 [= числовое_значение_1],
    символьное_имя_2 [= числовое_значение_2],
    ...
}

Явное присваивание элементам перечисления числовых значений (т.е. все что в квадратных скобках) можно опускать. При этом элементам перечисления автоматически присваиваются значения начиная с нуля, и увеличиваются на единицу.

Для представления доступных операционных систем мы могли бы использовать следующее перечисление:

public enum OSType {
    Win7,
    Win10
}

Создание экземпляра перечисления

Перечисления в C# относятся к значимым типам, таким образом создание экземпляра перечисления возможно без использования ключевого слова new(), путем прямого присваивания значения переменной перечисления:

public enum OSType {
    Win7,
    Win10
}

static void Main() {
    OSType ostype = OSType.Win7;
    Console.WriteLine(ostype);
}

Получение количества элементов перечисления и перебор элементов перечисления.

Базовым классом для всех перечислений является System.Enum. Класс Enum содержит статический метод GetNames, который позволяет получить перечень имен элементов перечисления. Метод GetNames возвращает массив типа string[], содержащий имена элементов перечисления.

Пример использования метода Enum.GetNames():

public enum OSType
{
    Win7,
    Win10
}

static void Main()
{
    foreach (string ostypeName in Enum.GetNames(typeof(OSType)))
        Console.WriteLine(ostypeName);
}

// Вывод:
// Win7
// Win10

Еще один статический метод класса EnumGetValues – позволяет получить перечень числовых значений элементов перечисления.

Пример использования метода Enum.GetValues():

public enum OSType
{
    Win7,
    Win10
}

static void Main()
{
    foreach (int ostypeValue in Enum.GetValues(typeof(OSType)))
        Console.WriteLine(ostypeValue);
}

// Вывод:
// 0
// 1

Общее количество элементов перечисления можно получить используя любой из методов класса EnumGetNames или GetValues при помощи метода Array.Length:

public enum OSType
{
    Win7,
    Win10
}

static void Main()
{
    int ostypeElementsCount;
    // Получаем количество элементов в перечислении OSType
    ostypeElementsCount = Enum.GetValues(typeof(OSType)).Length;
    Console.WriteLine(ostypeElementsCount);
}

// Вывод:
// 2

Представление перечислений в символьном виде (enum.ToFriendlyString).

Один из способов представления перечислений в нормальном текстовом виде – создание метода расширения:

public enum OSType
{
    Win7,
    Win10
}

public static class OSTypeExtensions
{
    public static string ToFriendlyString(this OSType osType)
    {
        switch (osType)
        {
            case OSType.Win7:
                return "Windows 7";
            case OSType.Win10:
                return "Windows 10";                
            default:
                return string.Empty;
        }
    }
}

class Program
{
    static void Main()
    {
        OSType ostype = OSType.Win10;
        // Следующая строка выведет: Windows 10
        Console.WriteLine(ostype.ToFriendlyString()); 
    }
}

Представление перечислений в символьном виде с помощью Description

Более универсальный метод с использованием атрибута Description из пространства имен System.ComponentModel был предложен на сайте StackOverflow:

public static string GetDescription<T>(this T enumerationValue)
    where T : struct
{
    Type type = enumerationValue.GetType();
    if (!type.IsEnum)
    {
        throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue");
    }

    MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
    if (memberInfo != null && memberInfo.Length > 0)
    {
        object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            return ((DescriptionAttribute)attrs[0]).Description;
        }
    }
    return enumerationValue.ToString();
}
avatar
5000
  Подписаться  
Уведомление о