当我尝试将VFP9语言COM / DLL中的Array
返回到我的.NET C#项目时
我收到一个System.Object[*]
数组,我无法转换为System.Object[]
(没有星号)。
答案 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为什么。