Системный класс 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