Объединение нескольких перечислений в список основных перечислений
Можно ли объединить несколько переходов вместе? Ниже приведен пример кода, который я хотел бы видеть:
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
}
}