繁体   English   中英

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

[英]Given an object, which is an array of enum values, how can I get an Enum[] without knowing the enum type

如何从包含某个枚举类型数组的对象类型变量转换为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中产生空值。

有没有办法做到这一点?

更新

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

此外,由于克里斯·辛克莱在评论接受的答案指出阵列的协方差适用于引用类型的枚举肯定不是。 (请参阅: MSDN中的.NET数组协方差规则 。)

我怀疑你必须创建一个新数组并转换每个元素,因为MyEnum[]不是Enum[] 一个简单的LINQ查询可以做到这一点:

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

编辑:根据您的意见,如果您只想迭代一次并避免创建数组,您可以抛弃ToArray()调用并将其视为延迟的IEnumerable<Enum>

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

所以它本质上只是迭代元素并一次抛出一个元素。

EDITx2:从编辑过的问题到为什么数组协方差没有起作用,这是因为它仅适用于枚举不是的引用类型 MSDN 12.5阵列协方差

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM