我在通过 HTMLBridge 将 JavaScript 数组和字典类型对象传递给我的托管代码中的方法时遇到了一些问题。Microsoft文章中详细介绍此主题和网络的信息让我无处可去。
使用链接文章中的以下信息:
NET Framework 属性或类型为对象的输入参数在按值封送至目标 .NET Framework 属性或输入参数时使用以下启发式方法进行转换:
JavaScript 数组转换为
object[]
.JavaScript 字典被转换为
Dictionary<string,object>
.
...我尝试以多种方式将数组和字典对象传递给我的托管代码,但没有成功:
Javascript:
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
C#(尝试#1):
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
C#(尝试#2):
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
C#(尝试#3):
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
例外的形式是(其中“TARGET TYPE”是由显式或隐式强制转换(包括Object[]
)产生的对象的预期类型:
SCRIPT16389:System.ArgumentException:无法将此对象转换为指定类型TARGET TYPE。参数名称:targetType
在 System.Windows.Browser.ScriptObject.ConvertTo(类型 targetType,布尔 allowSerialization)
在 System.Windows.Hosting.ScriptingInterface.GetScriptParamValueForType(ScriptParam scriptParam,键入所需类型)
在 System.Windows.Hosting.ScriptingInterface.ConvertFromScriptParams(ParameterInfo[] 参数,ScriptParam[] args)
在 System.Windows.Browser.ManagedObjectInfo.ScriptMethod.Invoke(ManagedObject obj,InvokeType invokeType,ScriptParam[] args)
在 System.Windows.Browser.ManagedObjectInfo.Invoke(ManagedObject obj,InvokeType invokeType,String memberName,ScriptParam [] args)
在 System.Windows.Hosting.ManagedHost.InvokeScriptableMember(IntPtr pHandle,Int32 nMemberID,Int32 nInvokeType,Int32 nArgCount,ScriptParam [] pArgs,ScriptParam & pResult,ExceptionInfo & pExcepInfo)
(类似的尝试将字典对象作为 传递给 C# Dictionary<string, object>
)。
这些尝试是否是对上述文章及其他文章中信息的误解的结果?还是我的实现根本不正确?
附录:
我知道用ScriptObject.getProperty()
完成我想要的方法,但如果可能的话,我想处理具体的、精确的类型。更不用说如果键值不能像前两者一样拆箱,它会返回本机类型、String 或 ScriptObject。我讨厌被简化为在任意嵌套的对象上反复调用它,直到我到达一个本机类型。