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

Che*_*eva 7 c# interop casting visual-foxpro

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

Tho*_*que 9

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

object[] newArray = sourceArray.Cast<object>().ToArray();
Run Code Online (Sandbox Code Playgroud)

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

public static Array CreateInstance(
    Type elementType,
    int[] lengths,
    int[] lowerBounds
)
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)


Tim*_*mwi 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);
Run Code Online (Sandbox Code Playgroud)


Roa*_*ump 5

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