如何将System.Object 强制转换为System.Object

当我尝试将VFP9语言COM / DLL中的Array返回到我的.NET C#项目时,我收到一个System.Object[*]数组,我无法转换为System.Object[] (没有星号)。

蒂姆维的解决方案应该可行。 你可以使用Linq做一些简单的事情:

 object[] newArray = sourceArray.Cast().ToArray(); 

如果您需要重新创建System.Object[*]以将其传递回VFP,您可以使用Array.CreateInstance方法的此重载 :

 public static Array CreateInstance( Type elementType, int[] lengths, int[] lowerBounds ) 

您可以按如下方式使用它:

 object[] normalArray = ... // create array with lower bound of 1 Array arrayStartingAt1 = Array.CreateInstance( typeof(object), new[] { normalArray.Length }, new[] { 1 }); Array.Copy(normalArray, 0, arrayStartingAt1, 1, normalArray.Length); 

不幸的是,你无法直接投射它。 但是,您可以创建一个类型为object[]的新数组并复制数据。 就像是…

 Array sourceArray = ...; if (sourceArray.Rank != 1) throw new InvalidOperationException("Expected a single-rank array."); object[] newArray = new object[sourceArray.Length]; Array.Copy(sourceArray, sourceArray.GetLowerBound(0), newArray, 0, sourceArray.Length); 

我有一个类似的问题。 从一个互操作程序集中获得一个数组作为dynamic对象,也从索引一开始。 当我尝试将其转换为Array对象时,我收到了相同的错误消息。
做其他答案建议不起作用。 出于一个奇怪的原因,即使读取Length属性也会引发exception。
我找到了这个答案,但它确实奏效了。
显然,如果使用C#4.0,则必须先将dynamic转换为object ,然后将其转换为Array 。 在.NET的早期版本中,您可以直接进行转换。
这是解释原因。