У меня есть класс под названием Questions
(множественное число). В этом классе есть перечисление Question
(единственное), которое выглядит следующим образом.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
В Questions
классе у меня есть get(int foo)
функция, которая возвращает Questions
объект для этого foo
. Есть ли простой способ получить целочисленное значение из перечисления, чтобы я мог сделать что-то вроде этого Questions.Get(Question.Role)
?
get(int foo)
вы можете определить его, аget(Question foo)
затем выполнить кастинг внутри метода, вы можете вызвать свой метод какQuestions.Get(Question.Role)
Ответы:
Просто приведите перечисление, например
Вышеприведенное будет работать для подавляющего большинства перечислений, которые вы видите в дикой природе, так как базовый тип по умолчанию для перечисления это
int
.Однако, как отмечает Сесилфиллип , перечисления могут иметь разные базовые типы. Если перечисление объявляется как
uint
,long
илиulong
, он должен быть приведен к типу перечисления; например дляты должен использовать
источник
enum Test { Item = 1 }
и увидеть, что1 == (int)Test.Item
это равно.(int)Test.Item
Это актерский состав! () является явным оператором приведения.enum Question
не был,int
ноlong
это приведение будет усекатьRole
интегральное значение!Enum
в качестве параметра, вы знаете, что вы можете получить только фиксированное количество возможных интегральных значений. С другой стороны, если вы просто берете anint
, то вам нужно проверить,int
находится ли это в пределах допустимых значений, что усложнит код. Вы всегда можете переопределить свои подписи как `` `public void MyMethod (int x) {// сделать что-то с x} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``Так как Перечисления могут быть любым интегральным типом (
byte
,int
,short
и т.д.), более надежный способ получить лежащее в основе интегрального значения перечисления было бы сделать использованиеGetTypeCode
метода в сочетании сConvert
классом:Это должно работать независимо от базового целочисленного типа.
источник
var
это типobject
, поэтому вам нужно распаковать его, и он станет более грязным, чем мне бы хотелось.object val = Convert...etc
var
object
Объявите его как статический класс, имеющий открытые константы:
И тогда вы можете ссылаться на него как
Question.Role
, и он всегда оценивается какint
или как вы его определяете.источник
static readonly int
потому что константы скомпилированы в их жесткие значения. См. Stackoverflow.com/a/755693/492const
а неstatic readonly
потому, что каждый раз, когда вы сравниваете,static readonly
вы вызываете метод, чтобы получить значение переменной, тогда какconst
вы сравниваете два типа значений напрямую.compilation limitation
имея в виду, что значение жестко закодировано, когда вы его компилируете, поэтому любое изменение этого значения потребует перекомпиляции всех сборок, использующих его. Я склонен согласиться с вами по поводу использования, потому что изменение значений будет иметь далеко идущие последствия.Приведет к
value == 2
.источник
С другой стороны, если вы хотите получить
int
значениеSystem.Enum
, то укажитеe
здесь:Ты можешь использовать:
Последние два просто безобразны. Я предпочитаю первый.
источник
Это проще, чем вы думаете - перечисление уже int. Это просто нужно напомнить:
источник
Пример:
И в коде, чтобы получить значение enum:
или
Перечисления будут увеличиваться на 1, и вы можете установить начальное значение. Если вы не установите начальное значение, оно будет изначально присвоено как 0.
источник
1
вint
кроме вас явно определить иначеНедавно я перешел от использования перечислений в моем коде в пользу использования классов с защищенными конструкторами и предопределенными статическими экземплярами (благодаря Roelof - C # Enure Valid Enum Values - Futureproof Method) ).
В свете этого, ниже, как я теперь подхожу к этой проблеме (включая неявное преобразование в / из
int
).Преимущество этого подхода состоит в том, что вы получаете все, что у вас было бы из перечисления, но ваш код теперь гораздо более гибок, поэтому, если вам нужно выполнять различные действия, основанные на значении
Question
, вы можете поместить логику вQuestion
себя (то есть в предпочтительный ОО) fashion) вместо того, чтобы помещать в ваш код множество операторов case для решения каждого сценария.NB: Ответ обновлен 2018-04-27, чтобы использовать функции C # 6; т.е. выражения объявления и определения тела лямбда-выражения. Смотрите историю изменений для оригинального кода. Это дает преимущество, делая определение немного менее многословным; которая была одной из основных жалоб на подход этого ответа.
источник
Если вы хотите получить целое число для значения enum, которое хранится в переменной, тип которой будет
Question
использоваться, например, в методе, вы можете просто сделать это, как я написал в этом примере:Это изменит заголовок окна на 4, так как переменная
Geselecteerd
являетсяTalen.Nederlands
. Если я изменю его наTalen.Portugees
и вызову метод снова, текст изменится на 3.источник
Чтобы убедиться, что значение enum существует, а затем проанализировать его, вы также можете сделать следующее.
источник
Может быть, я пропустил это, но кто-нибудь пробовал простой общий метод расширения?
Это прекрасно работает для меня. Таким способом вы можете избежать приведения типов в вашем API, но в конечном итоге это приведет к операции изменения типа. Это хороший случай для программирования Roslyn, чтобы компилятор сделал метод GetValue <T> для вас.
источник
Еще один способ сделать это:
Это приведет к:
источник
... это хорошая декларация.
Вы должны привести результат к int следующим образом:
В противном случае тип по-прежнему
QuestionType
.Этот уровень строгости является способом C #.
Одна альтернатива - вместо этого использовать объявление класса:
Это менее элегантно для объявления, но вам не нужно приводить его в коде:
Кроме того, вы можете чувствовать себя более комфортно с Visual Basic, который обслуживает такого рода ожидания во многих областях.
источник
number
должен иметь значение2
.источник
bool
*,byte
,ushort
,int
, иuint
**. GetHashCode для других типов изменяет значение, например, выполняет некоторые битовые смещения и xors. (* 1/0, ** приведено к int, конечно). Но в общем, просто не делайте этого, если это не ваш личный код.Вы можете сделать это, реализовав метод расширения для вашего определенного типа перечисления:
Это упрощает получение значения int текущего значения перечисления:
или
источник
Вместо этого используйте метод расширения:
И использование немного красивее:
источник
источник
Использование:
Это приведет
value == 2
.Это верно только в том случае, если перечисление помещается внутрь
int
.источник
int
конечно, так какGetHashCode
возвращает целое число.Поскольку перечисления могут быть объявлены с несколькими примитивными типами, может быть полезен универсальный метод расширения для приведения любого типа перечисления.
источник
Ниже приводится метод расширения
источник
Мой любимый хак с int или меньшими перечислениями:
Для перечисления
Эта,
выходы
Отказ от ответственности:
Это не работает для перечислений, основанных на долго.
источник
Самым простым решением, которое я могу придумать, является перегрузка
Get(int)
метода следующим образом:где
[modifiers]
обычно может быть таким же, как дляGet(int)
метода. Если вы не можете редактироватьQuestions
класс или по какой-то причине этого не хотите, вы можете перегрузить метод, написав расширение:источник
Пример, который я хотел бы предложить «получить значение int из перечисления», это
Теперь ответ будет 1.
источник
Использование:
источник
Попробуйте это вместо преобразования enum в int:
источник
В Visual Basic это должно быть:
источник
Я придумал этот метод расширения, который включает в себя текущие функции языка. Используя динамический, мне не нужно делать это универсальным методом и указывать тип, который делает вызов более простым и последовательным:
источник