.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 

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