Tengo una clase llamada Questions
(plural). En esta clase hay una enumeración llamada Question
(singular) que se ve así.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
En la Questions
clase tengo una get(int foo)
función que devuelve un Questions
objeto para eso foo
. ¿Hay una manera fácil de obtener el valor entero de la enumeración para que pueda hacer algo como esto Questions.Get(Question.Role)
?
get(int foo)
puedes definirlo yget(Question foo)
luego hacer tu casting dentro del método, puedes llamar a tu método comoQuestions.Get(Question.Role)
Respuestas:
Solo eche la enumeración, por ejemplo
Lo anterior funcionará para la gran mayoría de las enumeraciones que ve en la naturaleza, ya que el tipo subyacente predeterminado para una enumeración es
int
.Sin embargo, como señala cecilphillip , las enumeraciones pueden tener diferentes tipos subyacentes. Si una enumeración se declara como a
uint
,long
oulong
, se debe convertir al tipo de enumeración; por ejemplo paraDeberías usar
fuente
enum Test { Item = 1 }
y ver que1 == (int)Test.Item
es igual.(int)Test.Item
Eso es un elenco! () es el operador de conversión explícito.enum Question
no fueraint
perolong
este reparto truncaráRole
el valor integral!Enum
como parámetro, sabe que solo puede obtener un número fijo de valores integrales posibles. Por otro lado, si toma simplemente unint
, entonces debe validar siint
está dentro de los valores aceptados, lo que complica el código. Siempre puede anular sus firmas como `` public void MyMethod (int x) {// hacer algo con x} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``Desde Enums puede ser cualquier tipo integral (
byte
,int
,short
, etc.), una forma más sólida para obtener el valor integral subyacente de la enumeración sería la de hacer uso delGetTypeCode
método en conjunción con laConvert
clase:Esto debería funcionar independientemente del tipo integral subyacente.
fuente
var
es de tipoobject
, por lo que debe desempaquetarlo y se vuelve más complicado de lo que me gustaría.object val = Convert...etc
lavar
en su ejemplo será siempreobject
.Declararlo como una clase estática con constantes públicas:
Y luego puede hacer referencia a él como
Question.Role
, y siempre se evalúa comoint
o lo que sea que usted defina.fuente
static readonly int
porque las constantes se compilan en sus valores duros. Ver stackoverflow.com/a/755693/492const
y nostatic readonly
porque cada vez que comparasstatic readonly
estás haciendo una llamada a un método para obtener el valor de la variable, mientras que con unaconst
estás comparando dos tipos de valores directamente.compilation limitation
quiero decir que el valor está codificado cuando lo compila, por lo que cualquier cambio en ese valor requeriría que todos los ensamblajes que lo usan tengan que volver a compilarse. Me inclino a estar de acuerdo con usted sobre el uso porque cambiar los valores tendría implicaciones de largo alcance.Resultará en
value == 2
.fuente
En una nota relacionada, si desea obtener el
int
valor deSystem.Enum
, dadoe
aquí:Puedes usar:
Los dos últimos son simplemente feos. Prefiero la primera.
fuente
Es más fácil de lo que piensas: una enumeración ya es un int. Solo necesita ser recordado:
fuente
Ejemplo:
Y en el código de atrás para obtener el valor de enumeración:
o
Las enumeraciones aumentarán en 1 y puede establecer el valor inicial. Si no establece el valor inicial, se le asignará inicialmente 0.
fuente
1
enint
excepto que defina explícitamente lo contrarioRecientemente me he convertido de usar enumeraciones en mi código a favor de usar clases con constructores protegidos e instancias estáticas predefinidas (gracias a Roelof - C # Garantizar valores de enumeración válidos - Método a prueba de futuro ).
A la luz de eso, a continuación es cómo abordaría ahora este problema (incluida la conversión implícita a / desde
int
).La ventaja de este enfoque es que obtiene todo lo que tendría de la enumeración, pero su código ahora es mucho más flexible, por lo que si necesita realizar diferentes acciones en función del valor de
Question
, puede poner la lógica enQuestion
sí misma (es decir, en el OO preferido moda) en lugar de poner muchas declaraciones de casos en todo el código para abordar cada escenario.NB: la respuesta se actualizó el 27/04/2018 para utilizar las funciones de C # 6; es decir, expresiones de declaración y definiciones de cuerpo de expresión lambda. Ver historial de revisiones para el código original. Esto tiene el beneficio de hacer que la definición sea un poco menos detallada; que había sido una de las principales quejas sobre el enfoque de esta respuesta.
fuente
Si desea obtener un número entero para el valor enum que se almacena en una variable, para el cual sería el tipo
Question
, para usar, por ejemplo, en un método, simplemente puede hacer esto que escribí en este ejemplo:Esto cambiará el título de la ventana a 4, porque la variable
Geselecteerd
esTalen.Nederlands
. Si lo cambio y vuelvo aTalen.Portugees
llamar al método, el texto cambiará a 3.fuente
Para asegurarse de que existe un valor de enumeración y luego analizarlo, también puede hacer lo siguiente.
fuente
Tal vez me lo perdí, pero ¿alguien ha intentado un método de extensión genérico simple?
Esto funciona muy bien para mi. Puede evitar el tipo de conversión en su API de esta manera, pero finalmente resulta en una operación de cambio de tipo. Este es un buen caso para programar a Roslyn para que el compilador haga un método GetValue <T> para usted.
fuente
Una forma más de hacerlo:
Resultará en:
fuente
... es una buena declaración.
Tienes que enviar el resultado a int así:
De lo contrario, el tipo sigue siendo
QuestionType
.Este nivel de rigor es la forma C #.
Una alternativa es usar una declaración de clase en su lugar:
Es menos elegante declararlo, pero no es necesario convertirlo en código:
Alternativamente, puede sentirse más cómodo con Visual Basic, que satisface este tipo de expectativas en muchas áreas.
fuente
number
Debería tener el valor2
.fuente
bool
*,byte
,ushort
,int
, yuint
**. GetHashCode para otros tipos modifica el valor, por ejemplo, hace algunos cambios de bits y xors. (* 1/0, ** lanzado a int por supuesto). Pero, en general, no haga esto a menos que sea su propio código privado.Puede hacer esto implementando un método de extensión para su tipo de enumeración definido:
Esto simplifica obtener el valor int del valor enum actual:
o
fuente
Use un método de extensión en su lugar:
Y el uso es un poco más bonito:
fuente
fuente
Utilizar:
Resultará en
value == 2
.Esto solo es cierto si la enumeración cabe dentro de un
int
.fuente
int
por supuesto, ya queGetHashCode
devuelve un entero.Dado que las enumeraciones pueden declararse con múltiples tipos primitivos, un método de extensión genérico para convertir cualquier tipo de enumeración puede ser útil.
fuente
El siguiente es el método de extensión
fuente
Mi truco favorito con int o enumeraciones más pequeñas:
Por una enumeración
Esta,
salidas
Descargo de responsabilidad:
No funciona para enumeraciones basadas en mucho tiempo.
fuente
La solución más fácil que se me ocurre es sobrecargar el
Get(int)
método de esta manera:donde
[modifiers]
generalmente puede ser el mismo que para elGet(int)
método. Si no puede editar laQuestions
clase o por alguna razón no lo desea, puede sobrecargar el método escribiendo una extensión:fuente
El ejemplo que me gustaría sugerir "para obtener un valor 'int' de una enumeración" es
Ahora la respuesta será 1.
fuente
Utilizar:
fuente
Pruebe este en lugar de convertir enum a int:
fuente
En Visual Basic, debería ser:
fuente
Se me ocurrió este método de extensión que incluye características de lenguaje actuales. Al usar Dynamic, no necesito hacer de este un método genérico y especificar el tipo que mantiene la invocación más simple y consistente:
fuente