7

When I Tried to return an Array in VFP9 language COM/DLL to my .NET C# project I receive a System.Object[*] array and I can not cast to System.Object[] (Without asterisk).

4

3 回答 3

9

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

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

如果您需要重新创建 aSystem.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);
于 2010-09-16T22:33:57.363 回答
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);
于 2010-09-16T22:29:51.553 回答
5

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

于 2016-12-19T16:43:43.047 回答