Класс System.Enum

Системный класс Enum предоставляет статические методы для работы с перечислениями. Рассмотрим наиболее часто используемые из них.

Определение типа перечисления

Метод GetUnderlyingType позволяет получить тип который лежит в основе перечисления:

enum BackColor : long
{
    Gray,
    Orange,
    Aqua
}

static void PrintType()
{
    var bc = BackColor.Gray;
    Type initialType = Enum.GetUnderlyingType(bc.GetType());
    Console.WriteLine(initialType); //System.Int64
}

Конвертация числа в константу перечисления

Метод ToObject конвертирует целочисленное значение в экземпляр перечисления указанного типа:

object o = Enum.ToObject(typeof(BackColor), 1); 
Console.WriteLine(o); // Orange

Форматированный вывод

Format предоставляет возможность форматированного конвертирования перечисления в строку.

В качестве параметров принимает тип, значение и формат представления данных в виде строковой переменной:

  • G – формат представления по умолчанию;
  • F – рассматривает перечисление как битовые флаги;
  • D – выводит числовое значение перечисления в десятичной системе;
  • X – числовое представление в шестнадцатеричной системе.

Строка формата не чувствительна к регистру.

enum Lang : ulong
{
    Ukr,
    Rus,
    Eng
}

static void ShowEnum()
{
    var a = Enum.Format(typeof(Lang), Lang.Ukr, "G"); //Ukr 
    var b = Enum.Format(typeof(Lang), Lang.Rus, "D"); //1 

    Console.WriteLine($"{a}\r\n{b}");
}

Преобразование строки

Метод Parse конвертирует строку в перечисление указанного типа, строка и тип передаются в качестве аргументов, параметр ignoreCase определяет чувствительность метода к регистру строковой переменной:

enum Flag : byte
{
    NotSet,
    Ok,
    Error
}

static void Main(string[] args)
{
    var temp = (Flag)Enum.Parse(typeof(Flag), "error", ignoreCase: true);
}

Проверка наличия значения в перечислении

Для проверки существования целочисленного или строкового значения в перечислении используется метод IsDefined, он возвращает логическое true если значение найдено, в противном случае false.

enum Pet : uint
{
    None = 0,
    Dog = 1,
    Cat = 2
}

static void Main(string[] args)
{
    Console.WriteLine($"{Enum.IsDefined(typeof(Pet), "Cat")}"); //true
    Console.WriteLine($"{Enum.IsDefined(typeof(Pet), 6)}"); //false
}

Проверка флага

В предыдущей статье рассматривались битовые флаги, там для проверки использовалась конструкция с логическим И, однако в C# есть метод для проверки наличия установленного флага в экземпляре:

[Flags]
enum Anchor : int
{
    Left = 0b0001,
    Top = 0b0010,
    Bottom = 0b0100,
    Right = 0b1000
}

static void Main(string[] args)
{
    var topLeft = Anchor.Top | Anchor.Left;
    if (topLeft.HasFlag(Anchor.Left))
    {
        Console.WriteLine("Flag present");
    }
}

Массив имен констант

enum Color
{ 
    White = 0,
    Red,
    Green,
    Blue,
    Black
}

Для получения названий всех констант из перечисления используется метод GetNames:

foreach(string item in Enum.GetNames(typeof(Color)))
    Console.WriteLine(item);

Для получения одного имени по значению, можно использовать метод GetName:

string name = Enum.GetName(typeof(Color), 2); //Green

Смотрите также: