Системний клас 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# має метод HasFlag для перевірки наявності встановленого флажка в екземплярі:
[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