不能 access/convert System.Double[*] 对象

Can't access/convert System.Double[*] object

我使用一个接口来访问一个旧的应用程序。从这个应用程序我有一些 "double array" 我不能 access.The return 类型被声明为虚拟动态。每当我访问数组时都会出现异常。

this question我发现可能是因为错误的索引数组。所以我已经尝试了建议的解决方案,但正如我所说,如果没有出现异常,我什至无法访问数组一次。

知道错误是什么吗?

用 Hans 方法编写代码:

var dataSetValues = dataSet.DoubleArray;
var result = ConvertDoubleArray(dataSetValues); // <<<<<< This is where I get an exception

public static double[] ConvertDoubleArray(Array arr)
{
    if (arr.Rank != 1) 
        throw new ArgumentException();

    var retval = new double[arr.GetLength(0)];
    for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix)
        retval[ix - arr.GetLowerBound(0)] = (double) arr.GetValue(ix);
    return retval;
}

DoubleArray 的接口声明:

public virtual dynamic DoubleArray { get; set; }

运行时类型信息:

异常:

System.InvalidCastException: Unable to cast object of type 'System.Double[*]' to type 'System.Double[]'. at CallSite.Target(Closure , CallSite , VirtualEnvironmentManager , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1) at FormulaTestExecutor.Common.VirtualEnvironmentManager.CreateVirtualStructure(Formula formula) in D:\Develop\TFS\Main\tools\FormulaMTest\FormulaTestExecutor\FormulaTestExecutor\Common\VirtualEnvironmentManager.cs:line 55

异常堆栈跟踪:

FormulaTestExecutor.exe!FormulaTestExecutor.Common.VirtualEnvironmentManager.CreateVirtualStructure(FormulaTestExecutor.Model.Formula formula = {FormulaTestExecutor.Model.Formula}) Line 55 C# Symbols loaded. FormulaTestExecutor.exe!FormulaTestExecutor.Program.Main(string[] args = {string[0]}) Line 18 C# Symbols loaded.

你必须这样做:

var dataSetValues = dataSet.DoubleArray; // dataSetValues is dynamic
var result = ConvertDoubleArray((Array)(object)dataSetValues);

原因是 DoubleArray 的 'dynamic' 类型(这可能是您添加 COM 引用时在界面中自动定义的)。它是一个 super smart thing,它试图自己完成从 System.Double[*]System.Double[] 的转换,但它不够聪明,无法做到这一点(它无法读取 Whosebug 的答案......但是)

因此,您必须要求它仅传递对象 'as is',才能将其直接传递给 CLR 低级转换,这可以做到 System.Double[* ] 到数组 w/o 崩溃。获得数组后,您可以重新使用 ConvertDoubleArray 实用程序。

实际上我找到了一个解决方案: Unable to cast object of type 'System.Single[*]' to type 'System.Single[]'

如果我想转换安全数组,我首先需要将它转换为 .NET 对象,然后才能将其转换为数组。

var dataSetValues = (Array)(object)dataSetDoubleArray;