如何将包含某个枚举类型数组的对象类型变量转换为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 Array Covariance rules in MSDN。)
答案 0 :(得分:6)
我怀疑你必须创建一个新数组并投射每个元素,因为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 covariance:
对于任何两个引用类型 A和B,如果是隐式引用 转换(第6.1.4节)或显式参考转换(第 6.2.3)从A到B存在,那么从阵列类型A [R]到阵列类型B [R]
也存在相同的参考转换