Как создать массив перечислений

У меня есть приблизительно 30 различных отмеченных перечислений, которые я хотел бы поместить в массив для индексации и быстрого доступа. Позвольте мне также claify, что у меня нет 1 перечисления с 30 значениями, но у меня есть 30 перечислений с отличающимися суммами значений.

Цель состояла бы в том, чтобы добавить их к массиву в индексе specifed. Таким образом, я могу записать функции, в которых я могу передать индекс массива в для того, чтобы установить конкретные значения перечисления.

Обновленный: Вот пример того, что я желаю сделать.

перечислимое основное (enum1 = 0, enum2 = 1, enumn = n-1) - это имеет indexs, который соответствовал бы индексу связанного перечисления

[флаг] enum1 (value1=0, value2=1, value3=2, value4=4...)

[флаг] enum2 ("")

[флаг] enum2 ("")

так как я использую flagable перечисления, у меня есть класс как следующее

public static class CEnumWorker
{
   public static enum1 myEnum1 = enum1.value1;
   public static enum2 myEnum2 = enum2.value1;
   public static enumN myEnumN = enumN.value1;

   //I would then have functions that set the flags on the enums. I would like to access the enums through an array or other method so that I do not have to build a large switch statement to know which enum I am wanting to manipulate
}
9
задан user381347 1 July 2010 в 19:05
поделиться

4 ответа

Поскольку у вас есть 30 различных типов перечислений, вы не можете создать для них строго типизированный массив. Лучшее, что вы могли бы сделать, это создать массив System.Enum:

Enum[] enums = new Enum[] { enum1.Value1, enum2.Value2, etc };

. Затем вам нужно будет выполнить приведение при извлечении перечисления из массива, если вам нужно строго типизированное значение перечисления.

19
ответ дан 4 December 2019 в 10:03
поделиться

Если я правильно понимаю, вам нужно будет сделать:

object[] enums = new object[30];
enums[0] = Enum1.Value1;
enums[1] = Enum2.AnotherValue;

Но тогда вам придется получить доступ вот так (не строго типизированный, и легко ссылаться на неправильный индекс):

if ((Enum1)enums[0] == Enum1.Value1)
...

В .NET 4 вы могли бы использовать Tuple:

var enums = new Tuple<Enum1, Enum2>(Enum1.Value1, Enum2.AnotherValue);

if (enums.Item1 == Enum1.Value1)
...

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

class Enums
{
  public Enum1 Enum1 { get; set; }
  public Enum2 Enum2 { get; set; }
}

Enums enums = new Enums();
enums.Enum1 = Enum1.Value1;
enums.Enum2 = Enum2.AnotherValue;

if (enums.Enum1 == Enum1.Value1)
...

Я бы порекомендовал последний способ, потому что вы используете ссылочный тип, вы не зависите от позиции индекса, вы можете дать свойствам любое имя, какое захотите, и он строго типизирован. Единственное, что вы «теряете», - это возможность легко перебирать список, но вы можете добиться этого с помощью Reflection, если вам действительно нужно.

2
ответ дан 4 December 2019 в 10:03
поделиться

Вы всегда можете использовать старый добрый object[], но это означает, что придется делать много кастингов.

0
ответ дан 4 December 2019 в 10:03
поделиться

Enum предоставляет два механизмы для преобразования целого числа в значение перечисления - метод GetValues ​​() и простое приведение:

enum EnumA { A1, A2, A1234 }
enum EnumB { B00, B01, B02, B04 }

class Program
{
    static void Main(string[] args)
    {
        EnumA a = ((EnumA[])Enum.GetValues(typeof(EnumA)))[0];

        Console.WriteLine(a);

        EnumB boa = (EnumB)3;

        Console.WriteLine(boa);
    }
}

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

0
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

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