In Excel you can return a dynamic array System.Object[*]
, from a series object using XValues
. In .NET 3.5 you can access the elements in this object by casting it to and array, i.e.:
var values = (Array)series.XValues;
In .NET 4.0, this no longer works, and the message
"Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'"
is given.
Any ideas? The following doesn't work:
System.Object[*]
.values[1]
, neither when cast as a dynamic.The values inside the array do show up in the debugger however.
The answer above is useful but does not address the issue of how to cast to Array.
Under .Net versions before 4.0 a simple cast would work.
in C# 4.0 one must use
System.Array a = (System.Array)((object) returnedObject ); // note order of brackets
see http://blogs.msdn.com/b/mshneer/archive/2010/06/01/oh-that-mysteriously-broken-visiblesliceritemslist.aspx
There are two distinct kind of arrays in .NET, a one dimensional 'vector' and multidimensional arrays. You got the latter back, a multidimensional array with a rank of 1. This will happen if the unmanaged code has returned a SAFEARRAY whose lower-bound isn't 0.
You can read the content of the array with Array.GetValue(). Or convert it, like this:
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;
}
Test:
var native = Array.CreateInstance(typeof(object), new int[] { 42 }, new int[] { 1 });
var dotnet = ConvertArray(native);
NOTE: you may have a problem in .NET 4.0 and up when you some COM type libraries, Office in particular. The property or method may return a variant that contains an array. Ends up as dynamic in your C# program. The C# compiler does not generate the proper binder code in that case. Work around that by casting first to (object), then to (Array).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With