.NET 4.0 Excel Interop与动态集合有关

J P*_*lar 5 .net excel .net-4.0 excel-interop

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

var values = (Array)series.XValues;
Run Code Online (Sandbox Code Playgroud)

在.NET 4.0中,这不再起作用,而且消息也是如此

"无法将'System.Object [*]'类型的对象强制转换为'System.Object []'"

给出.

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

  • 把它变成动态的.
  • 把它投到一个System.Object[*].
  • 只需将对象放入for循环中.
  • 尝试直接使用该值values[1],而不是在转换为动态时.

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

Gre*_*oud 7

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

在4.0之前的.Net版本下,一个简单的演员可以工作.

在C#4.0中必须使用

System.Array a = (System.Array)((object)  returnedObject ); // note order of brackets
Run Code Online (Sandbox Code Playgroud)

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


Han*_*ant 5

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

您可以使用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;
    }
Run Code Online (Sandbox Code Playgroud)

测试:

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

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