¿Cómo se int
puede lanzar a un enum
en C #?
3193
De una cadena:
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.")
}
De un int:
YourEnum foo = (YourEnum)yourInt;
Actualizar:
Del número también puedes
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
YourEnum
pasa si es dinámico y solo se sabrá en tiempo de ejecución, y lo que quiero es convertirEnum
?var result = Enum.TryParse(yourString, out yourEnum)
hoy en día (y verificar el resultado para determinar si la conversión falló).Enum.Parse
true
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
Solo échalo:
Puede verificar si está dentro del rango usando Enum.IsDefined :
fuente
Enum.IsDefined
, tenga en cuenta que puede ser peligroso: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspxIsDefined
para verificar los valores de entrada, te vuelves vulnerable a las personas que agregan nuevos valores de enumeración más tarde que pasarían unIsDefined
cheque (ya que el nuevo el valor existe en el nuevo código), pero que podría no funcionar con el código original que escribió. Por lo tanto, es más seguro especificar explícitamente los valores de enumeración que su código puede manejar.Alternativamente, use un método de extensión en lugar de una línea:
Uso:
O
fuente
System.String
parece contaminación del espacio de nombresCreo que para obtener una respuesta completa, las personas deben saber cómo funcionan las enumeraciones internamente en .NET.
Como funcionan las cosas
Una enumeración en .NET es una estructura que asigna un conjunto de valores (campos) a un tipo básico (el valor predeterminado es
int
). Sin embargo, en realidad puede elegir el tipo integral al que se asigna su enumeración:En este caso, la enumeración se asigna al
short
tipo de datos, lo que significa que se almacenará en la memoria como un corto y se comportará como un corto cuando lo emite y usa.Si lo mira desde un punto de vista de IL, una enumeración (normal, int) se ve así:
Lo que debería llamar su atención aquí es que
value__
se almacena por separado de los valores de enumeración. En el caso de la enumeraciónFoo
anterior, el tipo devalue__
es int16. Básicamente, esto significa que puede almacenar lo que quiera en una enumeración, siempre que los tipos coincidan .En este punto, me gustaría señalar que
System.Enum
es un tipo de valor, lo que básicamente significa queBarFlag
ocupará 4 bytes en la memoria yFoo
ocupará 2, por ejemplo, el tamaño del tipo subyacente (en realidad es más complicado que eso, pero Oye...).La respuesta
Entonces, si tiene un número entero que desea asignar a una enumeración, el tiempo de ejecución solo tiene que hacer 2 cosas: copiar los 4 bytes y nombrarlo de otra manera (el nombre de la enumeración). La copia está implícita porque los datos se almacenan como tipo de valor; esto básicamente significa que si usa código no administrado, simplemente puede intercambiar enumeraciones y enteros sin copiar datos.
Para que sea seguro, creo que es una buena práctica saber que los tipos subyacentes son iguales o implícitamente convertibles y garantizar que existan los valores de enumeración (¡no están marcados de forma predeterminada!).
Para ver cómo funciona esto, prueba el siguiente código:
Tenga en cuenta que el casting
e2
también funciona. Desde la perspectiva del compilador anterior, esto tiene sentido: elvalue__
campo simplemente se llena con 5 o 6 y cuando seConsole.WriteLine
llamaToString()
, el nombre dee1
se resuelve mientras que el nombre dee2
no lo es.Si eso no es lo que pretendía, use
Enum.IsDefined(typeof(MyEnum), 6)
para verificar si el valor que está asignando asigna a una enumeración definida.También tenga en cuenta que soy explícito sobre el tipo subyacente de la enumeración, aunque el compilador realmente verifica esto. Estoy haciendo esto para asegurarme de no encontrarme con sorpresas en el futuro. Para ver estas sorpresas en acción, puede usar el siguiente código (en realidad, he visto que esto sucede mucho en el código de la base de datos):
fuente
int
! =short
, Arrojará (falla el desempaquetado). Si lo haceobject o = (short)5;
, funcionará, porque entonces los tipos coincidirán. No se trata del rango, se trata realmente del tipo.Tome el siguiente ejemplo:
fuente
Estoy usando este código para transmitir int a mi enumeración:
Me parece la mejor solución.
fuente
A continuación se muestra una buena clase de utilidad para Enums
fuente
Para valores numéricos, esto es más seguro ya que devolverá un objeto sin importar qué:
fuente
Si está listo para 4.0 .NET Framework, hay una nueva función Enum. TryParse () que es muy útil y funciona bien con el atributo [Flags]. Ver método Enum. TryParse (String, TEnum%)
fuente
Si tiene un número entero que actúa como una máscara de bits y podría representar uno o más valores en una enumeración [Banderas], puede usar este código para analizar los valores de las banderas individuales en una lista:
Tenga en cuenta que esto supone que el tipo subyacente del
enum
es un entero de 32 bits con signo. Si fuera un tipo numérico diferente, tendría que cambiar el 32 codificado para reflejar los bits en ese tipo (o derivarlo programáticamente usandoEnum.GetUnderlyingType()
)fuente
A veces tienes un objeto para el
MyEnum
tipo. Me gustaEntonces:
fuente
Este es un método seguro de conversión seguro de enumeración de banderas:
fuente
Enum
lugar destruct
, lo que significa que no tenemos que depender de la verificación del tiempo de ejecución!Para convertir una cadena a ENUM o int a ENUM constante, necesitamos usar la función Enum.Parse. Aquí hay un video de youtube https://www.youtube.com/watch?v=4nhx4VwdRDk que realmente demuestra con cadena y lo mismo aplica para int.
El código va como se muestra a continuación, donde "rojo" es la cadena y "MyColors" es el color ENUM que tiene las constantes de color.
fuente
Me alejé un poco de la pregunta original, pero encontré una respuesta a la pregunta de desbordamiento de pila. Obtener el valor int de enum es útil. Cree una clase estática con
public const int
propiedades, que le permita recopilar fácilmente un montón deint
constantes relacionadas , y luego no tener que convertirlasint
al usarlas.Obviamente, se perderá parte de la funcionalidad de tipo enum, pero para almacenar un montón de constantes de identificación de la base de datos, parece una solución bastante ordenada.
fuente
Esto analiza enteros o cadenas a una enumeración de destino con coincidencia parcial en dot.NET 4.0 usando genéricos como en la clase de utilidad de Tawani anterior. Lo estoy usando para convertir variables de cambio de línea de comandos que pueden estar incompletas. Como una enumeración no puede ser nula, lógicamente debe proporcionar un valor predeterminado. Se puede llamar así:
Aquí está el código:
FYI: La pregunta era sobre números enteros, que nadie mencionó también se convertirá explícitamente en Enum. TryParse ()
fuente
Desde una cadena: (Enum.Parse está desactualizado, use Enum. TryParse)
fuente
El siguiente es un método de extensión ligeramente mejor
fuente
En mi caso, necesitaba devolver la enumeración de un servicio WCF. También necesitaba un nombre descriptivo, no solo el enum.ToString ().
Aquí está mi clase WCF.
Aquí está el método de extensión que obtiene la descripción de la enumeración.
Implementación:
fuente
Ya no sé de dónde saco la parte de esta extensión de enumeración, pero es de stackoverflow. ¡Lo siento por esto! Pero tomé este y lo modifiqué para enumeraciones con Flags. Para las enumeraciones con Flags hice esto:
Ejemplo:
fuente
Debería incorporar algún tipo de relajación coincidente para ser más robusto.
Caso de prueba
fuente
Diferentes formas de emitir desde y hacia
Enum
fuente
Puede ayudarlo a convertir cualquier dato de entrada a la enumeración deseada por el usuario . Supongamos que tiene una enumeración como la siguiente, que por defecto es int . Agregue un valor predeterminado al principio de su enumeración. Que se utiliza en el método de ayuda cuando no se encuentra una coincidencia con el valor de entrada.
NB: Aquí trato de analizar el valor en int, porque enum es por defecto int Si define enum como este, que es el tipo de byte .
Debe cambiar el análisis en el método auxiliar de
a
byte.TryParse(value.ToString(), out tempType)
Compruebo mi método para las siguientes entradas
Lo siento por mi ingles
fuente
Aquí es un método de extensión que se proyecta
Int32
aEnum
.Honra las banderas bit a bit incluso cuando el valor es más alto que el máximo posible. Por ejemplo, si tiene una enumeración con las posibilidades 1 , 2 y 4 , pero el int es 9 , entiende que es 1 en ausencia de un 8 . Esto le permite realizar actualizaciones de datos antes de las actualizaciones de código.
fuente
La forma fácil y clara de enviar un int a enum en C #:
fuente
Simplemente usa la conversión explícita Cast int to enum o enum to int
fuente
fuente
Simplemente haz lo siguiente:
Para asegurarse de que solo emite los valores correctos y de lo contrario puede lanzar una excepción:
Tenga en cuenta que usar IsDefined es costoso e incluso más que solo transmitir, por lo que depende de su implementación decidir si lo usa o no.
fuente
Puedes usar el método de extensión.
utilizar como código de abajo
enumeración:
Uso:
fuente