Класс System.Enum. Перечисления
Данная тема взаимосвязана со следующей темой:
Содержание
- 1. Класс System.Enum. Назначение. Обзор методов
- 2. Методы класса System.Enum
- 2.1. Метод GetName(). Получить значение константы в виде строки. Пример
- 2.2. Метод GetNames(). Получить массив имен констант перечисления. Пример
- 2.3. Метод GetValues(). Получить массив значений констант перечисления. Пример
- 2.4. Метод Parse(). Конвертировать строковое представление перечисления в объект. Пример
- 3. Пример использования класса System.Enum для определения количества дней в заданном месяце
- Связанные темы
Поиск на других ресурсах:
1. Класс System.Enum. Назначение. Обзор методов
Класс System.Enum является базовым классом для перечислений, используемых в программе.
Если объявить перечисление по образцу
enum EnumType { constant1, constant2, ..., constantN };
то создается тип данных с именем EnumType, содержащий строго определенные константные имена constant1, constant2 …, constantN.
Для экземпляра типа EnumType и для любого другого экземпляра, объявленного с ключевым словом enum, становятся доступными (наследуются) следующие методы базового класса System.Enum:
- GetValues() — возвращает массив значений констант в указанном перечислении в виде массива типа System.Array;
- GetName() — возвращает одиночное значение заданной константы в заданном перечислении как строка типа string;
- GetNames() — возвращает массив имен констант типа string[] в указанном перечислении;
- Parse() — конвертирует строчное представление имени или числового значения одной или нескольких констант перечисления в эквивалентный перечислимый объект.
⇑
2. Методы класса System.Enum
2.1. Метод GetName(). Получить значение константы в виде строки. Пример
Метод GetName() позволяет получить значение константы с некоторого перечисления в виде строки. Согласно документации общая форма метода следующая:
public static string GetName(System.Type enumType, object value);
здесь
- System.Type — абстрактный класс, представляющий типы классов, интерфейсов, массивов, значений, перечисления, параметров, обобщений;
- enumType — тип перечисления для которого нужно получить имя значения;
- value — значение конкретной константы из перечисления enumType.
Чтобы в метод GetName() передать тип перечисления EnumType, нужно использовать средство typeof() по образцу
typeof(EnumType)
При использовании метода возможны исключительные ситуации следующих типов:
- System.ArgumentNullException — возникает, когда значение enumType или value равно null;
- System.ArgumentException — возникает, когда значение enumType не является перечислением или значение value не является типом enumType.
Пример. В примере ниже получается название дня недели, который установлен в переменной d типа Days.
using System; namespace ConsoleApp12 { class Program { // Перечисление, определяющее дни недели enum Days { Mon, Tue, Wed, Thi, Fri, Sat, Sun }; static void Main(string[] args) { // 1. Объявить экземпляр перечисления Days d; // 2. Установить день недели вторник d = Days.Tue; try { // 3. Получить название дня недели в виде строки string strDay = Enum.GetName(typeof(Days), d); // 4. Вывести название дня недели Console.WriteLine("strDay = {0}", strDay); // strDay = Tue } catch (System.ArgumentNullException e) { Console.WriteLine(e.Message); } catch(System.ArgumentException e) { Console.WriteLine(e.Message); } } } }
⇑
2.2. Метод GetNames(). Получить массив имен констант перечисления. Пример
Метод GetNames() позволяет получить массив типа string[], содержащий имена констант указанного перечисления. Согласно документации общая форма метода следующая:
public static string[] GetNames(System.Type enumType);
здесь enumType – тип перечисления, для которого нужно получить строковое представление его констант.
При использовании метода могут возникнуть исключительные ситуации:
- типа System.ArgumentNullException, если enumType равно null;
- типа System.ArgumentException, если enumType не является перечислением типа System.Enum.
Пример.
using System; namespace ConsoleApp12 { class Program { // Перечисление, описывающее оценки enum Colors { Unsatisfactory = 2, Satisfactory = 3, Good = 4, Excellent = 5 }; static void Main(string[] args) { // 1. Объявить переменную типа Colors Colors cl; // 2. Получить имена перечисления cl try { string[] names; names = Enum.GetNames(typeof(Colors)); // 3. Вывести имена перечисления cl foreach (string name in names) Console.WriteLine(name); } catch (System.ArgumentNullException e) { Console.WriteLine(e.Message); } catch (System.ArgumentException e) { Console.WriteLine(e.Message); } } } }
Результат выполнения программы
Unsatisfactory Satisfactory Good Excellent
⇑
2.3. Метод GetValues(). Получить массив значений констант перечисления. Пример
Значение целочисленных или строчных констант из перечисления можно получить с помощью метода GetValues(), который имеет следующую общую форму:
public static System.Array GetValues(System.Type enumType);
здесь
- System.Array — тип значений констант, которые возвращаются в виде динамического массива;
- System.Type — абстрактный класс, представляющий типы классов, интерфейсов, массивов, значений, перечислений, параметров, обобщений;
- enumType — экземпляр перечисления типа System.Type.
При использовании метода могут возникать исключительные ситуации следующих типов:
- System.ArgumentNullException — случай, когда enumType == null;
- System.ArgumentException — случай, когда enumType не является перечислением;
- System.InvalidOperationException — случай, когда метод вызван отражением в контексте «только отражение» или enumType является типом сборки, которая отображается в контексте «только отражение».
Пример. В примере с помощью методов GetValues() и GetNames() выводятся имена и значения констант из перечисления, описывающего количество дней в определенном времени года.
using System; namespace ConsoleApp12 { class Program { // Перечисление, описывающее количество дней во времени года. // Принимается, что в феврале 28 дней. enum Seasons { Winter = 90, Spring = 92, Summer = 92, Autumn = 91 }; static void Main(string[] args) { try { // 1. Объявить переменную типа Seasons Seasons ss; // 2. Получить значения констант из перечисления ss Array values; values = Enum.GetValues(typeof(Seasons)); // 3. Получить имена из перечисления ss string[] names = Enum.GetNames(typeof(Seasons)); // 4. Вывести имена и значения из перечисления ss for (int i = 0; i < names.Length; i++) Console.WriteLine("{0} = {1}", names[i], (int)values.GetValue(i)); } catch (ArgumentNullException e) { Console.WriteLine(e.Message); } catch (ArgumentException e) { Console.WriteLine(e.Message); } catch (InvalidOperationException e) { Console.WriteLine(e.Message); } } } }
Результат выполнения программы
Winter = 90 Autumn = 91 Spring = 92 Summer = 92
⇑
2.4. Метод Parse(). Конвертировать строковое представление перечисления в объект. Пример
Метод Parse() позволяет получить отдельное значение из перечисления по его имени. Метод имеет несколько перегруженных реализаций. Согласно документации общая форма некоторых реализаций метода следующая:
public static object Parse (System.Type enumType, string value) public static object Parse (System.Type enumType, string value, bool ignoreCase)
здесь
- enumType — переменная типа перечисление;
- value — строчное представление значения из перечисления, которое нужно конвертировать;
- ignoreCase — флажок, определяющий нужно ли игнорировать регистр символов (true).
При использовании метода возможны исключительные ситуации следующих типов:
- System.ArgumentNullException — случай, когда enumType = null;
- System.ArgumentException — генерируется в случаях, когда enumType не является типом System.Enum или value не входит в перечень констант перечисления enumType;
- System.OverflowException — значение есть за пределами диапазона типа enumType.
Пример. В примере описывается перечисление Corners, содержащее количество углов известной фигуры. С помощью метода Parse() демонстрируется определение количества углов шестиугольника (Hexagon). При обращении к имени фигуры в перечислении, не учитывается регистр символов.
using System; namespace ConsoleApp12 { class Program { // Перечисление, определяющее количество углов в фигуре enum Corners { Triangle = 3, Circle = 0, Rectangle = 4, Hexagon = 6, Pentagon = 5 }; static void Main(string[] args) { try { // Получить количество углов шестиугольника, игнорировать регистр символов int nCorners = (int)System.Enum.Parse(typeof(Corners), "HEXAGON", true); Console.WriteLine("nCorners = {0}", nCorners); } catch (ArgumentNullException e) { Console.WriteLine(e.Message); } catch(ArgumentException e) { Console.WriteLine(e.Message); } catch(StackOverflowException e) { Console.WriteLine(e.Message); } } } }
Результат выполнения программы
nCorners = 6
⇑
3. Пример использования класса System.Enum для определения количества дней в заданном месяце
Условие задачи. Разработать программу, которая по номеру месяца выводит количество дней в этом месяце.
Решение. С целью демонстрации, в программе используются возможности класса System.Enum для получения значений из перечисления Months.
using System; namespace ConsoleApp12 { class Program { // Объявление типа перечисления Months, которое описывает месяцы года // в классе. // Jan = 1, Feb = 2, Mar = 3, Apr = 4 , ..., Dec = 12 enum Months { Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; static void Main(string[] args) { // Вывести количество дней в месяце, // использовать переменную типа Enum Console.WriteLine("Enter number of month (1..12):"); int month = Int32.Parse(Console.ReadLine()); // проверка, корректно ли введен месяц if ((month < 1) || (month > 12)) { Console.WriteLine("Wrong input."); return; } Months MN; // переменная типа Months // Инициализировать MN значением на основании переменной month. // Метод Enum.GetValues() возвращает класс System.Array. // В классе System.Array есть метод GetValue(), который возвращает // значение объекта по индексу (0..11). MN = (Months)Enum.GetValues(typeof(Months)).GetValue(month - 1); switch (MN) { case Months.Feb: Console.WriteLine("28 (29) days"); break; case Months.Apr: case Months.Jun: case Months.Sep: case Months.Nov: Console.WriteLine("30 days"); break; default: Console.WriteLine("31 days"); break; } } } }
Результат выполнения программы
Enter number of month (1..12): 5 31 days
⇑
Связанные темы
⇑