Tengo una enumeración de, por ejemplo, ' Gender
' ( Male =0 , Female =1
) y tengo otra enumeración de un servicio que tiene su propia enumeración de género ( Male =0 , Female =1, Unknown =2
)
Mi pregunta es ¿cómo puedo escribir algo rápido y agradable para convertir de su enumeración a la mía?
Respuestas:
El uso de un método de extensión funciona bastante bien, cuando se utilizan los dos métodos de conversión sugeridos por Nate:
Obviamente, no es necesario utilizar clases separadas si no lo desea. Mi preferencia es mantener los métodos de extensión agrupados por las clases / estructuras / enumeraciones a las que se aplican.
fuente
Dado
Enum1 value = ...
, entonces si te refieres por nombre:Si te refieres al valor numérico, por lo general solo puedes lanzar:
(con el elenco, es posible que desee usar
Enum.IsDefined
para verificar valores válidos)fuente
Enum.Tryparse
:Enum2 value2 = Enum.TryParse(value.ToString(), out Enum2 outValue) ? outValue : Enum2.Unknown;
Esto le permitirá manejar valores de entrada que no existenEnum2
sin necesidad de llamarEnum.IsDefined
o atraparArgumentException
mensajes de correo electrónicoEnum.Parse
. Tenga en cuenta que el orden de los parámetros es más o menos inversoEnum.Parse
.Simplemente envíe uno a int y luego a la otra enumeración (considerando que desea que el mapeo se realice en función del valor):
fuente
long
(oulong
) en lugar de unint
que tenga miembros definidos que estén arribaint.MaxValue
(o abajo)int.MinValue
), en cuyo caso la conversión aint
podría desbordarse y terminaría con un valor de enumeración indefinido que debería definirse.Para ser minucioso, normalmente creo un par de funciones, una que toma Enum 1 y devuelve Enum 2 y otra que toma Enum 2 y devuelve Enum 1. Cada una consta de una declaración de caso que asigna entradas a salidas y el caso predeterminado arroja una excepción con un mensaje quejándose de un valor inesperado.
En este caso particular, podría aprovechar el hecho de que los valores enteros de Masculino y Femenino son los mismos, pero lo evitaría ya que es pirateado y está sujeto a roturas si alguna de las enumeraciones cambia en el futuro.
fuente
Si tenemos:
y
Podemos hacer con seguridad
O incluso
Si desea cubrir el caso en el que una enumeración en el lado derecho del signo '=' tiene más valores que la enumeración en el lado izquierdo, tendrá que escribir su propio método / diccionario para cubrir eso, como sugirieron otros.
fuente
Podría escribir un método de extensión genérico simple como este
fuente
podría escribir una función simple como la siguiente:
fuente
Aquí hay una versión del método de extensión si alguien está interesado
fuente
fuente
Escribí un conjunto de métodos de extensión hace un tiempo que funcionan para varios tipos diferentes de
Enum
s. Uno en particular funciona para lo que está tratando de lograr y manejaEnum
s conFlagsAttribute
así comoEnum
s con diferentes tipos subyacentes.Desde allí, puede agregar otros métodos de extensión más específicos.
Este cambiará los tipos de mensajes de correo
Enum
electrónico como está intentando hacer.Tenga en cuenta, sin embargo, que PUEDE convertir entre cualquiera
Enum
y cualquier otroEnum
utilizando este método, incluso aquellos que no tienen banderas. Por ejemplo:La variable
turtle
tendrá un valor deTurtle.Blue
.Sin embargo, existe seguridad frente a
Enum
valores indefinidos con este método. Por ejemplo:En este caso,
access
se establecerá enWriteAccess.ReadWrite
, ya queWriteAccess
Enum
tiene un valor máximo de 3.Otro efecto secundario de mezclar
Enum
s conFlagsAttribute
y sin él es que el proceso de conversión no dará como resultado una coincidencia de 1 a 1 entre sus valores.En este caso,
letters
tendrá un valor de enLetters.H
lugar deLetters.D
, ya que el valor de respaldo deFlavors.Peach
es 8. Además, una conversión deFlavors.Cherry | Flavors.Grape
aLetters
produciríaLetters.C
, lo que puede parecer poco intuitivo.fuente
Basado en la respuesta de Justin anterior, se me ocurrió esto:
fuente
Sé que es una pregunta antigua y tengo muchas respuestas.Sin embargo, encuentro que usar una declaración de cambio como en la respuesta aceptada es algo engorroso, así que aquí están mis 2 centavos:
Mi método favorito personal es usar un diccionario, donde la clave es la enumeración de origen y el valor es la enumeración de destino, por lo que en el caso presentado en la pregunta, mi código se vería así:
Por supuesto, esto se puede envolver en una clase estática y usarse como métodos de extensión:
fuente
Puede usar ToString () para convertir la primera enumeración a su nombre, y luego Enum.Parse () para convertir la cadena de nuevo a la otra enumeración. Esto generará una excepción si el valor no es compatible con la enumeración de destino (es decir, para un valor "Desconocido")
fuente