如何将System.Object 强制转换为System.Object
当我尝试将VFP9语言COM / DLL中的Array
返回到我的.NET C#项目时,我收到一个System.Object[*]
数组,我无法转换为System.Object[]
(没有星号)。
蒂姆维的解决方案应该可行。 你可以使用Linq做一些简单的事情:
object[] newArray = sourceArray.Cast
如果您需要重新创建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的早期版本中,您可以直接进行转换。
这是解释原因。