如何在C#中将System.Array转换为object[]?

18

我有一个COM函数,它期望以object[]形式作为参数:

foo(object[] values)

我想将一些枚举字段传递给它,所以我使用以下代码:

object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType));

然而,当我尝试将fields传递给foo(...),即[foo(fields)]时,会出现以下错误:

"Unable to cast object of type `SomeEnumType[]' to type 'system.Object[]'.

有谁能告诉我我做错了什么吗?

3个回答

28

正如异常所述,你无法将 SomeEnumType[] 强制转换为 object[] - 前者是一个数组,其中每个值都是 SomeEnumType 值;而后者是一个引用元素的数组。

使用 LINQ,你可以很容易地创建一个 新的 数组:

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);

3
Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray()

谢谢。我在中间错过了类型转换。 - Tilak
然后你只是把它变成了Jon Skeet的答案,没有解释。 - Marc L.

1

您需要转换为正确的数组类型。可以尝试以下方式:

object[] fields = (object[])Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray();

错误信息显示该函数期望一个类型为“object”的对象数组,而你传入的是一个类型为“SomeEnumType”的对象,因此存在类型不匹配的问题。

确实。正如开发人员所暗示的那样,Array是一个对象,而不是C++风格的[]数组。 - user978122
足够真实 - 我来自C++背景:老习惯难改 :) - Pat Mustard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接