Как преобразовать между Перечислениями, где значения совместно используют те же имена?

Если я хочу преобразовать между два Enum типы, значения который, я надеюсь, имеют те же имена, есть ли аккуратный путь, или сделайте я должен сделать это как это:

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

?

11
задан BartoszKP 10 September 2015 в 13:35
поделиться

3 ответа

Если у вас есть строгий контроль над двумя перечислениями, тогда ваше решение (или Randolpho's ) в порядке.

Если вы этого не сделаете, я бы пропустил хитрости и создал класс статического сопоставления, который преобразует их между собой. На самом деле, я бы, вероятно, рекомендовал это в любом случае (даже если вы пока наносите на карту по имени), с точки зрения простоты обслуживания.

6
ответ дан 3 December 2019 в 08:54
поделиться

Вы также можете сделать это, не знаю, достаточно ли это аккуратно:

enum A { One, Two }

enum B { Two, One }

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

Для этого, конечно, требуется метод расширения:

static B ToB(this A a)
{
    switch (a)
    {
        case A.One:
            return B.One;
        case A.Two:
            return B.Two;
        default:
            throw new NotSupportedException();
    }
}
5
ответ дан 3 December 2019 в 08:54
поделиться

Используйте это (при необходимости инкапсулируйте переменные в новый класс):

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
2
ответ дан 3 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: