2010-04-22 3 views
6

Si je veux convertir entre deux types Enum, dont les valeurs, je l'espère, le même nom, est là une belle façon, ou dois-je le faire comme ceci:Comment convertir entre énumérations où les valeurs partagent les mêmes noms?

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()); 
} 

?

Répondre

3

Si vous avez un contrôle strict sur les deux années ENUM, votre solution (ou Randolpho's) est très bien.

Si vous ne le faites pas, alors je sauter d'essayer d'être difficile et de créer une classe de mappage statique qui convertit entre eux. En fait, je vous recommande sans doute que de toute façon (même si vous associez par nom là pour l'instant), du point de vue facilité d'entretien.

+0

Je serais d'accord - bien qu'il soit possible de lancer à partir d'un autre une fonction de cartographie serait mor e transparent et moins sujette à erreur. –

2

Vous pouvez aussi le faire, ne savent pas si elle est assez nette:

enum A { One, Two } 

enum B { Two, One } 

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

Bien sûr, nécessite une méthode d'extension:

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

Utilisez ce (encapsulent des variables à la nouvelle classe nécessaire):

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 
Questions connexes