不能 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;
我使用一个接口来访问一个旧的应用程序。从这个应用程序我有一些 "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;