关于c#:如何创建枚举数组

How to create an array of enums

我有大约30个不同的标记枚举,我想将它们放入一个数组中,以便索引和快速访问。我还要说明,我没有一个具有30个值的枚举,但有30个具有不同值量的枚举。

目标是将它们添加到指定索引的数组中。通过这种方式,我可以编写一个函数,在该函数中,我可以将数组索引传递到中,以设置枚举的分离性值。

更新:下面是我想做的一个例子。

枚举主元枚举=0,枚举=1,enum n=n-1)-它具有与关联枚举的索引匹配的索引。

[旗帜]Enum1(值1=0,值2=1,值3=2,值4=4…)

[旗帜]枚举("")

[旗帜]枚举("")

因为我使用的是可标记的枚举,所以我有如下类

1
2
3
4
5
6
7
8
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
}


由于有30种不同类型的枚举,因此无法为它们创建强类型数组。最好是一个System.Enum数组:

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

如果需要强类型的枚举值,则在从数组中拉出枚举时必须强制转换。


如果我理解正确,你必须:

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

但是您必须这样访问(不是强类型,而且容易引用错误的索引):

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

在.NET 4中,可以使用元组:

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

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

…但我不推荐这么多(30)个枚举,我认为甚至有8个左右的限制。您还可以创建自己的类:

1
2
3
4
5
6
7
8
9
10
11
12
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)
...

我建议使用最后一种方法,因为您使用的是引用类型,您不依赖于索引位置,您可以给属性指定任何名称,并且它是强类型的。您唯一"失去"的是能够轻松地遍历列表,但如果确实需要,您可以通过反射来实现这一点。


枚举提供了两种将整数转换为枚举值的机制-getValues()方法和纯强制转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
    }
}

如果可以使用这些机制之一从int中获取枚举,那么我不太确定为什么要创建自己的数组。


你可以一直使用好的旧的object[],但这意味着要做大量的铸造。