.NET 4.0 Excel Interop与dynamic集合的问题
在Excel中,您可以使用XValues
从一个系列对象中返回一个dynamic数组System.Object[*]
。 在.NET 3.5中,您可以通过将其转换为数组来访问此对象中的元素,即:
var values = (Array)series.XValues;
在.NET 4.0中,这不再起作用,并且消息
“无法投射”System.Object [*]“types的对象来键入”System.Object []“”
给出。
有任何想法吗? 以下不起作用:
- 把它铸造成dynamic的。
- 将其转换为
System.Object[*]
。 - 只需将对象放置在每个循环中。
- 尝试直接使用
values[1]
访问值,而不是当作为dynamic投射时。
然而,数组内的值在debugging器中显示。
.NET中有两种不同types的数组,一维“向量”和multidimensional array。 你得到了后者,一个秩为1的multidimensional array。如果非托pipe代码已经返回一个下界不为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; }
testing:
var native = Array.CreateInstance(typeof(object), new int[] { 42 }, new int[] { 1 }); var dotnet = ConvertArray(native);
注意:您可能在.NET 4.0中遇到问题,特别是当您使用某些COMtypes库时,可能会出现问题。 该属性或方法可能会返回一个包含数组的变体。 在C#程序中dynamic结束。 在这种情况下,C#编译器不会生成适当的联编程序代码。 通过先转换(对象),然后转换(Array)来解决这个问题。
上面的答案是有用的,但没有解决如何投射到数组的问题。
在4.0之前的.Net版本中,一个简单的转换就可以工作。
在C#4.0中必须使用
System.Array a = (System.Array)((object) returnedObject ); // note order of brackets