2011-08-11 22 views
5

Tengo dos objetos C# muy similares pero no idénticos. Estoy copiando los valores de una clase a otra.C# Copiando la enumeración de un objeto a otro

Cada clase tiene algunas propiedades que exponen un tipo de enumeración. El interior de las enumeraciones es el mismo pero los nombres son diferentes, p.

public enum EnumA 
{ 
A, 
B 
} 

public EnumA EnumAProperty 
{ 
get{ return enumA;} 
} 

public enum EnumB 
{ 
A, 
B 
} 

public EnumB EnumBProperty 
{ 
get{ return enumB;} 
} 

Quiero asignar el valor devuelto por EnumBProperty a EnumAProperty ¿es esto posible?

+0

Y sí sé que necesito un conjunto! – AJM

+0

hmmm no estoy seguro si los tipos enum son compatibles de esa manera ... –

+0

a menos que haya asignado valores a los miembros enum y haya obtenido el valor de EnumA y asignado ese valor a EnumB. Funcionaría eso? –

Respuesta

4

usted puede hacer a través de la fundición, pero yo no lo recomendaría, ya que es frágil - si alguno de los miembros de enumeración se reordenan o nuevos elementos añadidos el resultado no puede ser lo que esperas

EnumAProperty = (EnumA) EnumBProperty; 

Lo que es peor con el casting es si usted tiene artículos en su enumeración fuente sin equivalente en el destino - a continuación hay más colores que formas:

enum Color { Red = 0, Yellow = 1, Blue = 2 }; 
enum Shape (Square = 0, Triangle = 1 }; 

Color color = Color.Red; 
Shape shape = (Shape) color; 

shape podría terminar con el valor 2 aunque este valor no está definido.

En su lugar, me gustaría sugerir que utilice un comunicado switch para mapear:

EnumAProperty = ConvertToA(EnumBProperty); 

... 

private static EnumA ConvertToA(EnumBProperty b) 
{ 
    switch (b) 
    { 
     case EnumB.Flannel: return EnumA.HandTowel; 
     case EnemB.Vest: return EnumA.UnderShirt; 
     ... 
     default: throw new ArgumentOutOfRangeException("b"); 
    } 
} 
+1

1 para el ver importante, pero a menudo se pasa por alto, el punto que se puede asignar un valor que no está definido en la enumeración. –

4

Cada miembro enum tiene un valor entero correspondiente.
De forma predeterminada, estos valores se asignan en orden ascendente, comenzando con 0.

Si el orden de los elementos en las enumeraciones (y por lo tanto sus valores numéricos) son los mismos, sólo se puede convertir el valor numérico para EnumB para conseguir el miembro EnumB con el mismo valor:

EnumBProperty = (EnumB)(int)EnumAProperty; 

Si no es así, es necesario volver a analizarlo:

EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString()); 
0

Se podría convertirlo a un entero o convertirlo en una cadena y luego hacer un Enum.Parse en él.

0

intente lo siguiente:

EnumAProperty = (EnumA)Enum.Parse(typeof(EnumA), EnumBProperty.ToString); 
1

Mientras tanto la enumeración de los diferentes tipos que can'not asigna directamente. Puede definir offset para los artículos de un número entero por lo que puede asignar valores a través del valor entero

public enum EnumA 
{ 
A = 0, 
B = 1 
} 

public enum EnumB 
{ 
A = 0, 
B = 1 
} 

EnumBPropertry = (int)EnumAProperty 
+0

eso está bien, hasta que alguien cambia la definición de la enumeración en uno pero no el otro. –

0
EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString()); 
Cuestiones relacionadas