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

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

 foo(object[] values) 

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

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

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

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

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

正如exception所说,你无法将SomeEnumType[]转换为object[] – 前者是一个数组,其中每个值都是SomeEnumType值; 后者是一个数组,其中每个元素都是一个引用。

使用LINQ,您可以轻松地创建arrays:

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

这将基本上封装每个元素(每个枚举值)以创建IEnumerable ,然后从中创建一个数组。 它类似于Tilak的方法,但我更喜欢使用Cast因为我实际上并不需要通用投影。

或者:

 SomeEnumType[] values = (SomeEnumType[]) Enum.GetValues(typeof(SomeEnumType)); object[] fields = Array.ConvertAll(values, x => (object) x); 
 Enum.GetValues(typeof(SomeEnumType)).Cast().ToArray() 

您需要转换正确的数组类型。 尝试这些方面的东西:

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

错误消息指出该函数期望一个类型为“object”的对象数组,并且您传入的类型为“SomeEnumType”,因此存在类型不匹配。