18

我有一个期望object[]作为参数的 COM 函数:

foo(object[] values)

我想将一些enum字段传递给它,所以我使用以下内容:

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

但是,当我尝试传递fieldsfoo(...)ie [ foo(fields)] 时,出现错误:

“无法将‘SomeEnumType[]’类型的对象转换为‘system.Object[]’类型。

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

4

3 回答 3

27

正如例外所说,您不能将 cast a 转换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);
于 2012-05-21T06:10:59.050 回答
3
Enum.GetValues(typeof(SomeEnumType)).Cast<object>().ToArray()
于 2012-05-21T06:11:15.897 回答
1

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

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

错误消息说明该函数需要一个类型为“object”的对象数组,并且您传入的是“SomeEnumType”类型之一,因此存在类型不匹配。

于 2012-05-21T06:10:39.917 回答