我有一个COM函数,期望object[]
作为参数:
foo(object[] values)
我想将一些enum
字段传递给它,因此我使用以下内容:
object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType));
但是,当我尝试将fields
传递给foo(...)
,即[foo(fields)
]时,我收到错误消息:
“无法将类型为'SomeEnumType []'的对象强制转换为'system.Object []'。
谁能告诉我我做错了什么?
答案 0 :(得分:24)
如异常所述,您无法将SomeEnumType[]
转换为object[]
- 前者是一个数组,其中每个值都是SomeEnumType
值;后者是一个数组,其中每个元素都是一个参考。
使用LINQ,您可以轻松地创建 new 数组:
object[] fields = Enum.GetValues(typeof(SomeEnumType))
.Cast<object>()
.ToArray();
这基本上会将每个元素(每个枚举值)设置为IEnumerable<object>
,然后从中创建一个数组。它类似于Tilak的方法,但当我实际上不需要通用投影时,我更喜欢使用Cast
。
可替换地:
SomeEnumType[] values = (SomeEnumType[]) Enum.GetValues(typeof(SomeEnumType));
object[] fields = Array.ConvertAll(values, x => (object) x);
答案 1 :(得分:4)
Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray()
答案 2 :(得分:2)
您需要转换正确的数组类型。尝试以下几点:
object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray();
错误消息指出该函数期望一个类型为“object”的对象数组,并且您传入的类型为“SomeEnumType”,因此存在类型不匹配。