C#. Класс System.Enum. Перечисления




Класс 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

 


Связанные темы