5

在 Excel 中,您可以System.Object[*]使用从系列对象返回动态数组XValues。在 .NET 3.5 中,您可以通过将其转换为数组来访问此对象中的元素,即:

var values = (Array)series.XValues;

在 .NET 4.0 中,这不再有效,并且消息

“无法将 'System.Object[*]' 类型的对象转换为 'System.Object[]' 类型”

给出。

有任何想法吗?以下不起作用:

  • 将其转换为动态的。
  • 将其转换为System.Object[*].
  • 只需将对象放在 for each 循环中。
  • 尝试使用 直接访问该值values[1],而不是在转换为动态时。

然而,数组中的值确实显示在调试器中。

4

2 回答 2

7

上面的答案很有用,但没有解决如何转换为 Array 的问题。

在 4.0 之前的 .Net 版本下,可以进行简单的转换。

在 C# 4.0 中必须使用

System.Array a = (System.Array)((object)  returnedObject ); // note order of brackets

http://blogs.msdn.com/b/mshneer/archive/2010/06/01/oh-that-mysteriously-broken-visiblesliceritemslist.aspx

于 2012-01-13T15:39:35.187 回答
5

.NET 中有两种不同的数组,一维“向量”和多维数组。你得到了后者,一个秩为 1 的多维数组。如果非托管代码返回了一个 SAFEARRAY,其下限不是 0,就会发生这种情况。

您可以使用 Array.GetValue() 读取数组的内容。或者转换它,像这样:

    private static object[] ConvertArray(Array arr) {
        int lb = arr.GetLowerBound(0);
        var ret = new object[arr.GetUpperBound(0) - lb + 1];
        for (int ix = 0; ix < ret.Length; ++ix) {
            ret[ix] = arr.GetValue(ix + lb);
        }
        return ret;
    }

测试:

    var native = Array.CreateInstance(typeof(object), new int[] { 42 }, new int[] { 1 });
    var dotnet = ConvertArray(native);

注意:当您使用某些 COM 类型库时,您可能会在 .NET 4.0 及更高版本中遇到问题,尤其是 Office。属性或方法可能会返回包含数组的变体。在您的 C# 程序中以动态形式结束。在这种情况下,C# 编译器不会生成正确的绑定代码。通过先转换为 (object),然后转换为 (Array) 来解决这个问题。

于 2011-01-26T19:02:52.187 回答