2010-04-22 12 views
6

Jeśli chcesz przekonwertować między dwoma Enum rodzaju, wartości, które, mam nadzieję, że mają takie same nazwy, jest tam zgrabny sposób, czy też muszę to zrobić tak:Jak przekonwertować między wyliczeniami, w których wartości mają te same nazwy?

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

?

Odpowiedz

3

Jeśli masz ścisłą kontrolę nad dwoma enum, to twoje rozwiązanie (lub Randolpho's) jest w porządku.

Jeśli tego nie zrobisz, to pominę próbując być trudnym i utworzyć statyczną klasę odwzorowania, która będzie konwertować między nimi. W rzeczywistości prawdopodobnie i tak poleciłbym (nawet jeśli na razie mapujesz po nazwie) z perspektywy łatwości konserwacji.

+0

Muszę się zgodzić - podczas gdy możliwe jest odlewanie od siebie, funkcją odwzorowania byłoby mor przejrzyste i mniej podatne na błędy. –

2

Można też to zrobić, nie wiem, czy to wystarczy schludny:

enum A { One, Two } 

enum B { Two, One } 

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

To oczywiście wymaga metodę rozszerzenia:

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

Użyj tego (enkapsulacji zmienne do nowej klasy co potrzebne):

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 
Powiązane problemy