Как создать массив перечислений - PullRequest
9 голосов
/ 01 июля 2010

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

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

Обновлено: вот пример того, что я хочу сделать.

enum main (enum1 = 0, enum2 = 1, enumn = n-1) - здесь есть индексы, которые будут соответствовать индексу ассоциированного перечисления

[flag] enum1 (value1 = 0, value2 = 1, value3= 2, value4 = 4 ...)

[flag] enum2 ("")

[flag] enum2 ("")

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

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
}

Ответы [ 4 ]

17 голосов
/ 01 июля 2010

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

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

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

2 голосов
/ 01 июля 2010

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

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

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

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

В .NET 4 вы можете использовать кортеж:

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, если вам действительно это нужно.

0 голосов
/ 01 июля 2010

Enum предоставляет два механизма для преобразования целого числа в значение 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 голосов
/ 01 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...