Как можно int
привести к enum
C в?
3197
Из строки:
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);
// The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
{
throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
}
Из int:
YourEnum foo = (YourEnum)yourInt;
Обновить:
С номера вы также можете
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
YourEnum
он динамический и будет известен только во время выполнения, и что я хочу преобразовать вEnum
?var result = Enum.TryParse(yourString, out yourEnum)
настоящее время (и проверять результат, чтобы определить, не удалось ли преобразование).Enum.Parse
регистр не учитывался путем добавленияtrue
значения параметра к вызову:YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
Просто бросьте это:
Вы можете проверить, находится ли он в диапазоне, используя Enum.IsDefined :
источник
Enum.IsDefined
, имейте в виду , что это может быть опасно: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspxIsDefined
для проверки входных значений, вы оставляете себя уязвимым для людей, добавляющих новые значения enum позже, которые будут проходитьIsDefined
проверку (так как новый значение существует в новом коде), но может не работать с исходным кодом, который вы написали. Поэтому безопаснее явно указать значения перечисления, которые может обрабатывать ваш код.В качестве альтернативы используйте метод расширения вместо однострочного:
Применение:
ИЛИ
источник
System.String
выглядит как загрязнение пространства именЯ думаю, чтобы получить полный ответ, люди должны знать, как перечисления работают внутри .NET.
Как это работает
Перечисление в .NET - это структура, которая отображает набор значений (полей) в базовый тип (по умолчанию это
int
). Тем не менее, вы можете выбрать целочисленный тип, который будет отображаться в вашем перечислении:В этом случае перечисление отображается на
short
типом данных, что означает, что оно будет сохранено в памяти как короткое и будет вести себя как короткое, когда вы используете его.Если вы посмотрите на это с точки зрения IL, перечисление (normal, int) выглядит так:
На что следует обратить внимание, это то, что они
value__
хранятся отдельно от значений перечисления. В случае перечисленияFoo
выше типvalue__
int16. По сути, это означает, что вы можете хранить в перечислении все, что хотите, при условии совпадения типов .На данный момент я хотел бы отметить, что
System.Enum
это тип значения, который в основном означает, что онBarFlag
будет занимать 4 байта в памяти иFoo
будет занимать 2 - например, размер базового типа (на самом деле это сложнее, но Привет...).Ответ
Итак, если у вас есть целое число, которое вы хотите отобразить в перечисление, среда выполнения должна сделать только 2 вещи: скопировать 4 байта и назвать его как-нибудь иначе (имя перечисления). Копирование неявно, потому что данные хранятся как тип значения - это в основном означает, что если вы используете неуправляемый код, вы можете просто обмениваться перечислениями и целыми числами без копирования данных.
Чтобы сделать это безопасным, я думаю, что лучше всего знать, что базовые типы являются одинаковыми или неявно конвертируемыми, и гарантировать, что значения перечисления существуют (они не проверяются по умолчанию!).
Чтобы увидеть, как это работает, попробуйте следующий код:
Обратите внимание, что приведение к
e2
также работает! С точки зрения компилятора выше это имеет смысл:value__
поле просто заполняется либо 5, либо 6, а приConsole.WriteLine
вызовеToString()
имяe1
разрешается, а имяe2
- нет.Если это не то, что вы хотели, используйте,
Enum.IsDefined(typeof(MyEnum), 6)
чтобы проверить, соответствует ли значение, которое вы приводите, определенному перечислению.Также обратите внимание, что я явно говорю о базовом типе перечисления, даже если компилятор действительно проверяет это. Я делаю это, чтобы избежать неожиданностей в будущем. Чтобы увидеть эти сюрпризы в действии, вы можете использовать следующий код (на самом деле я видел, как это часто случается в коде базы данных):
источник
int
! =short
, Оно будет выброшено (распаковка не удалась). Если вы это сделаетеobject o = (short)5;
, это будет работать, потому что тогда типы будут совпадать. Речь идет не о диапазоне, а о типе.Возьмите следующий пример:
источник
Я использую этот кусок кода, чтобы привести int к моему enum:
Я считаю это лучшим решением.
источник
Ниже приведен хороший полезный класс для Enums
источник
Для числовых значений это безопаснее, так как будет возвращать объект независимо от того, что:
источник
Если вы готовы к 4.0 .NET Framework, есть новая функция Enum.TryParse (), которая очень полезна и хорошо работает с атрибутом [Flags]. См. Enum.TryParse Method (String, TEnum%)
источник
Если у вас есть целое число, которое действует как битовая маска и может представлять одно или несколько значений в перечислении [Flags], вы можете использовать этот код для анализа значений отдельных флагов в списке:
Обратите внимание, что это предполагает, что основным типом
enum
является 32-разрядное целое число со знаком. Если бы это был другой числовой тип, вам пришлось бы изменить жестко закодированный 32, чтобы отразить биты в этом типе (или получить его программным путем, используяEnum.GetUnderlyingType()
)источник
Иногда у вас есть объект для
MyEnum
типа. подобноЗатем:
источник
Это безопасный метод преобразования с учетом перечисления:
источник
Enum
вместо этогоstruct
, что означает, что нам не нужно полагаться на проверку во время выполнения!Чтобы преобразовать строку в ENUM или int в константу ENUM, нам нужно использовать функцию Enum.Parse. Вот видео на YouTube https://www.youtube.com/watch?v=4nhx4VwdRDk которое фактически демонстрирует со строкой и то же самое относится к int.
Код выглядит так, как показано ниже, где «red» - это строка, а «MyColors» - это цвет ENUM, который имеет цветовые константы.
источник
Немного отойдя от исходного вопроса, но я нашел ответ на вопрос переполнения стека. Полезно получить значение int из enum . Создайте статический класс со
public const int
свойствами, что позволит вам легко собирать кучу связанныхint
констант, а затем не нужно приводить их к нимint
при использовании.Очевидно, что некоторые функциональные возможности типа enum будут потеряны, но для хранения нескольких констант идентификатора базы данных это выглядит довольно аккуратным решением.
источник
Это анализирует целые числа или строки в целевом перечислении с частичным соответствием в dot.NET 4.0, используя обобщенные значения, как в классе утилит Tawani выше. Я использую его для преобразования переменных командной строки, которые могут быть неполными. Поскольку перечисление не может быть нулевым, вы должны логически указать значение по умолчанию. Это можно назвать так:
Вот код:
К вашему сведению: вопрос был о целых числах, которые никто не упомянул, также будут явно конвертированы в Enum.TryParse ()
источник
Из строки: (Enum.Parse устарел, используйте Enum.TryParse)
источник
Ниже немного лучше метод расширения
источник
В моем случае мне нужно было вернуть enum из службы WCF. Мне также нужно было понятное имя, а не только enum.ToString ().
Вот мой класс WCF.
Вот метод Extension, который получает описание из Enum.
Реализация:
источник
Я больше не знаю, где я получу часть этого расширения enum, но это из stackoverflow. Я прошу прощения за это! Но я взял это и изменил для перечислений с флагами. Для перечислений с флагами я сделал это:
Пример:
источник
Вы должны создать некоторую релаксацию соответствия типов, чтобы быть более устойчивой.
Прецедент
источник
Различные способы приведения в и из
Enum
источник
Это может помочь вам преобразовать любые входные данные в желаемое перечисление пользователя . Предположим, у вас есть перечисление как ниже, которое по умолчанию int . Пожалуйста, добавьте значение по умолчанию в начале вашего перечисления. Который используется у помощников medthod, когда не найдено совпадений с входным значением.
NB: Здесь я пытаюсь разобрать значение в int, потому что enum по умолчанию int, если вы определили enum как этот, который является байтовым типом.
Вам нужно изменить синтаксический анализ при помощи вспомогательного метода с
в
byte.TryParse(value.ToString(), out tempType)
Я проверяю свой метод для следующих входов
Извините за мой английский
источник
Вот метод расширения, который приводится
Int32
кEnum
.Он учитывает побитовые флаги, даже когда значение превышает максимально возможное. Например, если у вас есть перечисление с возможностями 1 , 2 и 4 , но int равен 9 , он понимает это как 1 при отсутствии 8 . Это позволяет вам обновлять данные до обновления кода.
источник
простой и понятный способ приведения типа int к enum в c #:
источник
Вы просто используете явное преобразование Cast int в enum или enum в int
источник
источник
Вы просто делаете, как показано ниже:
Чтобы убедиться, что вы приводите только правильные значения и в противном случае вы можете сгенерировать исключение:
Обратите внимание, что использование IsDefined является дорогостоящим и даже больше, чем просто приведение, поэтому решение о том, использовать его или нет, зависит от вашей реализации.
источник
Вы можете использовать метод расширения.
используйте как ниже код
enum:
Применение :
источник