给定一个对象,它是枚举值的数组,在不知道枚举类型的情况下如何获得enum[]

本文关键字:枚举 情况下 类型 何获得 enum 不知道 数组 一个对象 | 更新日期: 2023-09-27 18:10:12

如何将包含某种枚举类型数组的对象类型变量转换为enum [] ?换句话说:

// Somewhere in the code we have: public enum MyEnum {This,That};
// Somewhere else in the code we have: public enum TheirEnum {What,Ever};
// In other parts of the code we have additional enum types
// Now, given:
object enumArrayOfSomeType=...; // Maybe it's of type MyEnum[] or TheirEnum[] or 
                                // SomeOtherEnum[]
// I want to say
Enum[] someEnumArray=enumArrayOfSomeType as Enum[];

不幸的是,给出的代码总是在someEnumArray中产生空值。

有办法做到这一点吗?

:

我想我期待数组协方差开始,但也许我期待太多了(即,数组协方差变得疯狂)。

同时,感谢Chris Sinclair在对公认答案的评论中指出,数组的协方差只对引用类型适用,而枚举肯定不是。(参见:. net数组协方差规则在MSDN)

给定一个对象,它是枚举值的数组,在不知道枚举类型的情况下如何获得enum[]

我怀疑您将不得不创建一个新数组并强制转换每个元素,仅仅是因为MyEnum[]不是Enum[]。一个简单的LINQ查询可以这样做:

Enum[] someEnumArray = ((IEnumerable)enumArrayOfSomeType).Cast<Enum>().ToArray();

编辑:根据你的评论,如果你只是想迭代它一次,避免创建一个数组,你可以放弃ToArray()调用,并将其视为延迟的IEnumerable<Enum>:

IEnumerable<Enum> someEnumArray = ((IEnumerable)enumArrayOfSomeType).Cast<Enum>();

因此,它本质上只是迭代元素并一次转换一个元素。

EDITx2:从关于为什么数组协方差不启动的编辑问题来看,这是因为它只适用于引用类型,而枚举不适用。来自MSDN 12.5 Array协方差:

对于任意两个引用类型 A和B,如果是隐式引用转换(第6.1.4节)或显式引用转换(第6.1.4节)6.2.3)存在从A到B的引用转换,那么从数组类型A[R]到数组类型B[R]也存在相同的引用转换