Как получить целочисленное значение (int) из enum в C#?
Явное приведение типов (кастинг)
Самый простой и распространённый способ — использовать явное приведение типа (cast). Поскольку по умолчанию базовым типом для enum является int, вы можете просто написать:
OrderStatus status = OrderStatus.Processing;
int statusValue = (int)status; // Результат: 2
Console.WriteLine(statusValue); // Выведет: 2
Это работает, потому что C# поддерживает явное преобразование между enum и его базовым типом. Однако неявное преобразование (как вы пробовали) запрещено, чтобы избежать случайных ошибок.
Использование Convert.ToInt32()
Второй способ — использовать метод Convert.ToInt32(). Он более универсален, так как работает с любым базовым типом (byte, short, long и т.д.) и даже с nullable-перечислениями:
OrderStatus status = OrderStatus.Shipped;
int statusValue = Convert.ToInt32(status); // Результат: 3
Console.WriteLine(statusValue);
Этот метод подходит, если вы не уверены в базовом типе enum или работаете с обобщённым кодом. Однако учтите, что Convert.ToInt32() может выбросить исключение, если значение выходит за пределы int.
Работа с разными базовыми типами
Если ваш enum использует другой базовый тип, например byte, техника та же — нужно явно приводить к нужному типу:
enum Priority : byte
{
Low = 1,
Medium = 2,
High = 3
}
Priority priority = Priority.High;
byte priorityByte = (byte)priority; // Результат: 3
int priorityInt = priorityByte; // Теперь можно неявно, т.к. byte -> int
Важно: если вы попытаетесь привести enum напрямую к int, когда базовый тип — byte, это тоже сработает, но может вызвать предупреждение компилятора о возможной потере данных (хотя для byte это безопасно). Лучше сначала привести к базовому типу, а затем к int.
Получение int из строкового представления
Если у вас есть имя enum в виде строки, вы можете сначала преобразовать его обратно в enum, а затем в int:
string statusName = "Delivered";
OrderStatus status = (OrderStatus)Enum.Parse(typeof(OrderStatus), statusName);
int statusValue = (int)status; // Результат: 4
Но это менее эффективно, чем работа с числами напрямую.
Рекомендации
- Для обычных случаев используйте явное приведение
(int)enumValue— это быстро и читаемо. - Для универсального кода (например, в обобщённых методах) применяйте
Convert.ToInt32(). - Для обратного преобразования (int -> enum) также используйте кастинг:
OrderStatus status = (OrderStatus)2;. - Избегайте хранения enum в виде строк в БД — числа работают быстрее и занимают меньше места.
В вашем случае с базой данных лучше всего подходит первый способ. Просто запишите (int)status в поле типа int.
Альтернативный подход: метод GetHashCode()
Технически можно использовать метод GetHashCode(), который возвращает int для любого объекта. Для enum он возвращает то же значение, что и явное приведение к int:
OrderStatus status = OrderStatus.New;
int statusValue = status.GetHashCode(); // Результат: 1
Console.WriteLine(statusValue);
Однако этот способ не рекомендуется, так как GetHashCode() не гарантирует уникальность в общем случае (хотя для enum это работает). Код становится менее очевидным для других разработчиков.
Использование Enum.GetUnderlyingType()
Если вы пишете обобщённый метод для работы с любыми enum, можно динамически определить базовый тип и преобразовать:
public static int EnumToInt(TEnum value) where TEnum : Enum
{
Type underlyingType = Enum.GetUnderlyingType(typeof(TEnum));
if (underlyingType == typeof(int))
return (int)(object)value;
else if (underlyingType == typeof(byte))
return (int)(byte)(object)value;
// ... другие типы
throw new NotSupportedException();
}
Это избыточно для простых случаев, но может пригодиться в библиотеках или фреймворках.
Совет для начинающих
Придерживайтесь явного приведения — это стандартный идиоматичный способ в C#. Не усложняйте код без необходимости. Если вам нужно часто преобразовывать enum в int, можно написать метод расширения:
public static class EnumExtensions
{
public static int ToInt(this Enum value)
{
return Convert.ToInt32(value);
}
}
// Использование:
int statusValue = OrderStatus.Processing.ToInt(); // 2
Это делает код более читаемым, но добавляет небольшой оверхед.