.NET 4.0 Excel与动态集合的互操作问题

.NET 4.0 Excel与动态集合的互操作问题,.net,excel,.net-4.0,excel-interop,.net,Excel,.net 4.0,Excel Interop,在Excel中,您可以使用XValues从序列对象返回动态数组System.Object[*]。在.NET 3.5中,您可以通过将该对象强制转换为和数组来访问该对象中的元素,即: var values = (Array)series.XValues; 在.NET4.0中,这不再有效,消息 “无法将“System.object[*]”类型的对象强制转换为“System.object[]”类型” 是的 有什么想法吗?以下操作不起作用: 把它铸造成动态的 将其强制转换为系统对象[*] 只需将对象放

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

var values = (Array)series.XValues;
在.NET4.0中,这不再有效,消息

“无法将“System.object[*]”类型的对象强制转换为“System.object[]”类型”

是的

有什么想法吗?以下操作不起作用:

  • 把它铸造成动态的
  • 将其强制转换为
    系统对象[*]
  • 只需将对象放置在for each循环中
  • 尝试直接使用
    值[1]
    访问该值,在强制转换为动态时也不尝试

但是,数组中的值确实会显示在调试器中。

在.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;
    }


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

上述答案很有用,但没有解决如何转换为数组的问题

在4.0之前的.Net版本下,简单的强制转换可以工作

在C#4.0中,必须使用

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

我遇到的问题是无法获取下限不为0的数组对象之外的值,我遇到的问题是无法将COM对象集合转换为.NET可用的任何对象。您提供的示例代码涉及使用数组类型的对象,但我无法将提供给我的集合强制转换为数组。不过,感谢您抽出时间。
无法强制转换“System.object[*]”类型的对象。
。这是一个数组。@HansPassant难度在于如何使用它,详情请参见我答案中的链接。
System.Array a = (System.Array)((object)  returnedObject ); // note order of brackets