我有大约30种不同的标记枚举,我想将其放入数组中以进行索引和快速访问。我还要声明,我没有1个带有30个值的枚举,但我有30个枚举值不同的枚举。
目标是将它们添加到指定索引处的数组中。这样我就可以编写一个函数,我可以在其中传递数组索引来设置枚举的特定值。
更新: 这是我想要做的一个例子。
enum main( enum1 = 0, enum2 = 1, enumn = n-1) - 这个索引与相关枚举的索引匹配
[标志] enum1(value1 = 0,value2 = 1,value3 = 2,value4 = 4 ......)
[标志] enum2( “”)
[标志] 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
}
答案 0 :(得分:17)
由于您有30种不同类型的枚举,因此无法为它们创建强类型数组。你可以做的最好的是一个System.Enum数组:
Enum[] enums = new Enum[] { enum1.Value1, enum2.Value2, etc };
如果你需要强类型的枚举值,那么在从数组中拉出枚举时你必须进行转换。
答案 1 :(得分:2)
如果我理解正确,你必须这样做:
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实现。
答案 2 :(得分:0)
你总是可以使用好的object[]
,但这意味着要进行大量的投射。
答案 3 :(得分:0)
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);
}
}
如果您可以使用其中一种机制从int获取枚举,我不太清楚为什么要创建自己的数组。