Дополнительно
Как привести int к enum?
Как можно привести int
к enum
в C#?
2989
20
Как можно привести int
к enum
в C#?
Из струны:
Из инт:
Обновление:
С номера вы также можете
Просто бросьте его:
Вы можете проверить, находится ли он в диапазоне, используя Enum.IsDefined:
Кроме того, можно использовать метод расширения, а не один-лайнер:
Использование:
Или
Я думаю, чтобы получить полный ответ, люди должны знать, как работают перечисления внутри .Чистая.
Как это работает
Перечислимый на .Net-это структура, которая отображает набор значений (полей) для основного типа (по умолчанию
инт
). Однако, вы можете выбрать интегрального типа, что ваше перечисление карт:В этом случае перечисление сопоставляется с
коротким
тип данных, который означает, что он будет храниться в памяти как короткий и будет вести себя как короткие, когда вы разыгрываете и использовать его.Если вы посмотрите на это с Ил точки зрения (нормальное, инт) перечисление выглядит так:
Что должно привлечь ваше внимание здесь заключается в том, что значение
__
хранится отдельно от значения enum. В случае перечисления сFoo
выше, типа значение__
это типа INT16. Это означает, что вы можете хранить все, что вы хотите в перечислимый, покуда типы соответствия.В этот момент я'd, как, чтобы указать, что система.Перечисление-это тип значения, который в основном означает, что BarFlag будет занимать 4 байта в памяти и с
foo
будет занимать 2 -- например, размер базового типа (он'ов на самом деле сложнее, но все же...).Ответ
Поэтому, если у вас есть целочисленное значение, которое вы хотите отобразить на перечисление, выполнения только 2 вещи: скопировать 4 байта и имя это что-то другое (имя перечисления). Копирование является неявным, поскольку данные хранятся как тип значения - это означает, что если вы использовать неуправляемый код, вы можете просто развязка перечислений и целых чисел без копирования данных.
Чтобы сделать его безопасным, я думаю, что это's не рекомендуется знать, что базовые типы являются одинаковыми или неявно преобразуемым и обеспечить перечисление значений (они не'т включен по умолчанию!).
Чтобы увидеть, как это работает, попробуйте следующий код:
Отметим, что кастинг в " Е2 " тоже работает! От компилятора точки зрения выше в этом есть смысл: значение
__
поле просто заполняется либо 5 или 6 и при этом консоль.Строку вызывает метод toString(), название
Е1` будет решен в то время как имя " Е2 " не.Если это's не то, что вы хотели, используйте перечисление.Метод isdefined(typeof на(MyEnum), 6), чтобы проверить, если значение, которое вы бросаете карты на определенное перечисление.
Также обратите внимание, что я'м четко базового типа перечисления, хотя компилятор проверяет это. Я'м делаешь это, чтобы гарантировать, что я Дон'т нарваться на каких-нибудь сюрпризов вниз по дороге. Чтобы увидеть эти сюрпризы в действии, вы можете использовать следующий код (на самом деле я'вэ увидел, как это произошло много в коде базы данных):
Возьмем следующий пример:
Я использую этот кусок кода для приведения int к моей перечисление:
Я считаю, что это лучшее решение.
Ниже отличная утилита класса для перечисления
Для числовых значений, это является более безопасным, так как он возвращает объект, неважно, что:
Если вы'вновь готовы к 4.0 .Сетка Основы, там's новый перечисление.Метод tryparse() функция'ы очень полезно и хорошо играет с атрибут [flags]. См. Перечисление.Метод tryparse метод (строки, TEnum%)
Если у вас есть целое число, которое выступает в качестве битовой маской и может представлять одно или несколько значений в [флаги] перечисление, вы можете использовать этот код для разбора отдельных значений флага в список:
Иногда у вас есть объект
MyEnum
тип. КакЗатем:
Это флаговым курсе безопасный метод Convert:
Для преобразования строки в int в enum или ПЕРЕЧИСЛИМОЙ константы мы должны использовать перечислимый.Функция разбора. Вот видео на YouTube [https://www.youtube.com/watch?v=4nhx4VwdRDk][2], которая на самом деле продемонстрировать's с строку и то же самое относится и к инт.
Код, как показано ниже, где"красным " и; есть строки и "mycolors и" это цвет перечисление цветом константы.
Немного уходим от изначального вопроса, но я нашла ответ на стек&ампер;усилитель; nbsp;переливом вопрос получить int значение из перечислимого полезные. Создать статический класс с
свойства общественных константный инт
, что позволяет легко собрать кучу констант, связанных сИнт
, и тогда не придется изгонять их вint
при их использовании.Очевидно, некоторые функции перечислимого типа будут потеряны, но для хранения кучей идентификатор константы базе, кажется, довольно изящного решения.
Этот синтаксический анализ целых чисел или строк на целевое перечисление с частичным совпадением в dot.NET 4.0 с помощью дженериков, как в Tawani'утилиты S-класса выше. Я использую его для преобразования командной строке переменные выключатель, который может быть неполной. Поскольку перечисление не может быть null, вы должны логически указать значение по умолчанию. Его можно назвать такой:
Здесь'ы код:
Для справки: вопрос был про целых, который никто не упомянул также явно преобразовать в enum.Метод tryparse()
Из строки: (перечисление.Разобрать устарело, используйте перечисление.Метод tryparse)
Следующие несколько лучше метода расширения
В моем случае, мне нужно вернуться перечисления из службы WCF. Я также нуждался в понятное имя, а не просто перечисление.Метод toString().
Здесь's мой класс WCF.
Здесь'ы метод расширения, который получает описание из enum.
Реализация:
Разные способы бросания от
перечисление
Я Дон'т не знаю, где мне взять часть этого расширения перечисление, но это из StackOverflow. Я извиняюсь за это! Но я взял этот один и модифицировал его для перечислений с флагами. Для перечислений с флагами я сделал это:
Пример: