.NET 4.0 Excel与动态集合的互操作问题
在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[]”类型” 是的 有什么想法吗?以下操作不起作用: 把它铸造成动态的 将其强制转换为系统对象[*] 只需将对象放
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