2010-04-22 19 views
6

Si quiero convertir entre dos tipos Enum, los valores de los que, espero, tienen los mismos nombres, hay una manera ordenada, o tengo que hacerlo de esta manera:Cómo convertir entre los puntos en los que los valores comparten los mismos nombres?

enum colours_a { red, blue, green } 
enum colours_b { yellow, red, blue, green } 

static void Main(string[] args) 
{ 
    colours_a a = colours_a.red; 
    colours_b b; 

    //b = a; 
    b = (colours_b)Enum.Parse(typeof(colours_b), a.ToString()); 
} 

?

Respuesta

3

Si usted tiene un control estricto sobre las dos de enumeración, entonces su solución (o Randolpho's) está muy bien.

Si no lo hace, entonces yo no iría a tratar de ser complicado y crear una clase de asignación estática que convierte entre ellos. De hecho, probablemente lo recomendaría de todos modos (incluso si mapea por su nombre por el momento), desde una perspectiva de fácil mantenimiento.

+0

Tendría que estar de acuerdo - si bien es posible emitir de uno a otro una función de mapeo sería mor e transparente y menos propenso al error. –

2

También puede hacer esto, no sé si es lo suficientemente limpio:

enum A { One, Two } 

enum B { Two, One } 

static void Main(string[] args) 
{ 
    B b = A.One.ToB(); 
} 

Por supuesto, esto requiere un método de extensión:

static B ToB(this A a) 
{ 
    switch (a) 
    { 
     case A.One: 
      return B.One; 
     case A.Two: 
      return B.Two; 
     default: 
      throw new NotSupportedException(); 
    } 
} 
2

Utilice esta (encapsulan las variables a la nueva clase como necesario):

class Program 
{ 

    enum colours_a { red, green, blue, brown, pink } 
    enum colours_b { yellow, red, blue, green } 

    static int?[] map_a_to_b = null; 

    static void Main(string[] args) 
    { 
     map_a_to_b = new int?[ Enum.GetValues(typeof(colours_a)).Length ]; 

     foreach (string eachA in Enum.GetNames(typeof(colours_a))) 
     { 

      bool existInB = Enum.GetNames(typeof(colours_b)) 
          .Any(eachB => eachB == eachA); 

      if (existInB) 
      { 
       map_a_to_b 
        [ 
        (int)(colours_a) 
        Enum.Parse(typeof(colours_a), eachA.ToString()) 
        ] 

        = 

        (int)(colours_b) 
        Enum.Parse(typeof(colours_b), eachA.ToString()); 
      }         
     } 

     colours_a a = colours_a.red; 
     colours_b b = (colours_b) map_a_to_b[(int)a]; 
     Console.WriteLine("Color B: {0}", b); // output red 

     colours_a c = colours_a.green; 
     colours_b d = (colours_b)map_a_to_b[(int)c]; 
     Console.WriteLine("Color D: {0}", d); // output green 
     Console.ReadLine(); 

     colours_a e = colours_a.pink; 
    // fail fast if e's color don't exist in b, cannot cast null to value type 
     colours_b f = (colours_b)map_a_to_b[(int)e]; 
     Console.WriteLine("Color F: {0}", f); 
     Console.ReadLine(); 

    }// Main 
}//Program 
Cuestiones relacionadas