Объединение нескольких перечислений в список основных перечислений

Можно ли объединить несколько переходов вместе? Ниже приведен пример кода, который я хотел бы видеть:

enum PrimaryColors
{
   Red,
   Yellow,
   Blue
}

enum SecondaryColors
{
   Orange,
   Green,
   Purple
}

//Combine them into a new enum somehow to result in:
enum AllColors
{
   Red,
   Orange,
   Yellow,
   Green,
   Blue,
   Purple
}

Не имеет значения, в каком порядке они находятся или какие их поддерживающие номера, я просто хочу, чтобы их можно было комбинировать.

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

Изменить: Причина этих перечислений состоит в том, что моя основная программа читает список команд для выполнения в определенное время, поэтому я хочу прочитать в файле, посмотреть, связана ли команда с ним одной из моих перечислений, и если это, вставляет его в список команд для выполнения.

Ответы

Ответ 1

Не уверен, что я точно понимаю. Но вы можете сделать List<> всех значений, подобных этому:

var allColors = new List<Enum>();

allColors.AddRange(Enum.GetValues(typeof(PrimaryColors)).Cast<Enum>());
allColors.AddRange(Enum.GetValues(typeof(SecondaryColors)).Cast<Enum>());

Вместо List<Enum> вы также можете использовать HashSet<Enum>. В любом случае, поскольку вы присваиваете тип PrimaryColor или SecondaryColor типу класса (а именно System.Enum), вы получаете бокс, но это просто техническая деталь (возможно).

Ответ 2

Причина этих перечислений состоит в том, что моя основная программа читает список команд для выполнения в определенное время, поэтому я хочу прочитать в файле, посмотреть, связана ли команда с ней одной из моих перечислений, и если это так, поместите его в список команд для выполнения.

Кажется, что вам не нужны три разных типа enum, вам нужен один тип (то, что вы называете "master enum" ), а также способ решить, какой из под-перечислений принадлежит определенному значению. Для этого вы можете использовать набор значений из вашего основного перечисления или switch.

Например:

enum Color
{
   Red,
   Orange,
   Yellow,
   Green,
   Blue,
   Purple
}

bool IsPrimaryColor(Color color)
{
    switch (color)
    {
    case Color.Red:
    case Color.Yellow:
    case Color.Blue:
        return true;
    default:
        return false;
    }
}

Кроме того, вы должны использовать уникальное имя для enum типов (если только это не флаг enum).

Ответ 3

Держите его простым и просто используйте неявные преобразования int или используйте функцию System.Enum.Parse():

enum PrimaryColors
{        
    Red = 0,
    Yellow = 2,
    Blue = 4
}

enum SecondaryColors
{
    Orange = 1,
    Green = 3,
    Purple = 5
}

//Combine them into a new enum somehow to result in:
enum AllColors
{
    Red = 0,
    Orange,
    Yellow,
    Green,
    Blue,
    Purple
}

class Program
{
    static AllColors ParseColor(Enum color)
    {
        return ParseColor(color.ToString());
    }
    static AllColors ParseColor(string color)
    {
        return (AllColors)Enum.Parse(typeof(AllColors), color);
    }
    static void Main(string[] args)
    {
        PrimaryColors color1=PrimaryColors.Red;
        AllColors result=(AllColors)color1;
        // AllColors.Red

        SecondaryColors color2=SecondaryColors.Green;
        AllColors other=(AllColors)color2; 
        // AllColors.Green

        AllColors final=ParseColor(PrimaryColors.Yellow);
        // AllColors.Yellow
    }
}