如何将System.Object [*]强制转换为System.Object []

时间:2010-09-16 22:20:25

标签: c# interop casting visual-foxpro

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

3 个答案:

答案 0 :(得分:9)

Timwi的解决方案应该可以正常工作。你可以使用Linq做一些简单的事情:

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

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

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

答案 1 :(得分:6)

不幸的是,你无法直接投射它。但是,您可以创建一个类型为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);

答案 2 :(得分:3)

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