C# 为什么不';我的JavaScript数组不能转换为适当的类型吗?
我在通过HTMLBridge将JavaScript数组和字典类型对象传递给托管代码中的方法时遇到了一些问题。网络内外的信息让我一事无成 使用链接文章中的以下信息: NET Framework属性或输入参数类型为对象 在按值封送到 目标.NET Framework属性或输入参数: JavaScript数组被转换为C# 为什么不';我的JavaScript数组不能转换为适当的类型吗?,c#,javascript,.net,silverlight,htmlbridge,C#,Javascript,.net,Silverlight,Htmlbridge,我在通过HTMLBridge将JavaScript数组和字典类型对象传递给托管代码中的方法时遇到了一些问题。网络内外的信息让我一事无成 使用链接文章中的以下信息: NET Framework属性或输入参数类型为对象 在按值封送到 目标.NET Framework属性或输入参数: JavaScript数组被转换为对象[] JavaScript字典被转换为字典 。。。我曾尝试以多种方式将数组和字典对象传递给托管代码,但没有成功: Javascript: var array = [{key: 1},
对象[]
JavaScript字典被转换为字典
。。。我曾尝试以多种方式将数组和字典对象传递给托管代码,但没有成功:
Javascript:
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
C#(尝试1):
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
[ScriptableMember]
//在此处引发转换异常
公共void testMethod(字典[]arrayParam)
{
//...
}
C#(尝试2):
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
[ScriptableMember]
公共void测试方法(对象arrayParam)
{
//在此处引发转换异常
字典[]arr=(字典[])数组参数;
}
C#(尝试3):
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
[ScriptableMember]
公共void测试方法(ScriptObject arrayParam)
{
//在此处引发转换异常
字典[]arr=
arrayParam.ConvertTo();
}
例外情况的形式为(其中“目标类型”是由显式或隐式强制转换(包括对象[]
)产生的预期对象类型):
SCRIPT16389:System.ArgumentException:无法转换此对象
到指定的类型目标类型。参数名称:targetType
在System.Windows.Browser.ScriptObject.ConvertTo(键入targetType,
布尔allowSerialization)
位于System.Windows.Hosting.ScriptingInterface.GetScriptParamValueForType(ScriptParam
scriptParam,类型desiredType)
位于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(ManagedObjectObj,
InvokeType InvokeType,字符串memberName,ScriptParam[]args)
位于System.Windows.Hosting.ManagedHost.InvokeScriptableMember(IntPtr
幻影,Int32 nMemberID,Int32 nInvokeType,Int32 nArgCount,
ScriptParam[]参数、ScriptParam和pResult、ExceptionInfo和PexceInfo)
(类似的尝试是将dictionary对象传递给C#asdictionary
)
这些尝试是由于对上述文章及其他文章中的信息的误解造成的吗?还是我的实现根本不正确
附录:
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
我知道有一种方法可以通过.getProperty()实现我的愿望
,但如果可能的话,我想处理具体的、精确的类型。更不用说,如果键控值不能作为前两个值中的任何一个解除绑定,它将返回本机类型、字符串或ScriptObject。我不想被简化为在任意嵌套对象上重复调用它,直到我找到一个本机类型。果真如此
[{key: 1}, {key: 2}, {key: 3}]
实际上是一种
object []
而不是字典类型
您的代码试图将数组强制转换到字典中,这将永远不会起作用
澄清一下,因为顶级对象是数组,因此对象[],所以JSON解析器不够聪明,无法知道数组中每个元素的单独类型
恐怕你得把它扔给我了
object[]
然后像这样处理它
Dictionary<string,object> cur;
foreach(object o in objArray)
{
cur = (Dictionary<string,object>) o;
}
字典cur;
foreach(对象数组中的对象o)
{
cur=(字典)o;
}
再看一眼链接文章,我相信引用的文本指的是由createObject
或createManagedObject
创建的托管对象上的编组操作
像这样的课程:
[ScriptableType]
public class TestClass
{
public object arrayObj;
public object dicObj;
public TestClass sibling;
public TestClass(){}
public void testMethod(TestClass testClassObj)
{
//Assuming argument came from Javascript
//& arrayObj and dicObj were assigned an
//Array and dictionary-obj respectively
testClassObj.arrayObj; //Formal type: Object. Actual type: object[]
testClassObj.dicObj; //Formal type: Object. Actual type:
// Dictionary<string, object>
}
}
private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = new MainPage();
HtmlPage.RegisterCreatableType("TestClass", typeof(TestClass));
HtmlPage.RegisterScriptableObject("scripTestClassObj", new TestClass());
}
可以在客户端像这样使用:
var testClassObj = silverlight_domElement.content
.services.CreateObject("TestClass");
testClassObj.arrayObj = [1,2,3];
testClassObj.dicObj = {key: 1};
silverlight_domElement.content.scripTestClassObj.testMethod(testClassObj);
//"sibling"'s arrayObj and dicObj types will have actual types
//of object[] and Dictionary<string, object> respectively
silverlight_domElement.content.scripTestClassObj.sibling = testClassObj;
var testClassObj=silverlight\u domeElement.content
.services.CreateObject(“TestClass”);
testClassObj.arrayObj=[1,2,3];
testClassObj.dicObj={key:1};
silverlight_domeElement.content.scripTestClassObj.testMethod(testClassObj);
//“同级”的arrayObj和dicObj类型将具有实际类型
//对象[]和字典的名称
silverlight_domeElement.content.scripTestClassObj.sibling=testClassObj;
换句话说,它与讨论中的功能无关
在我的问题中,这意味着将非原始Javascript值传递给托管代码需要遵守以下准则之一:
ScriptObject
(或Object
,因为这是它派生的类)createObject
)或类型调用createManagedObject
产生的对象(createManagedObject
)如果我所做的任何陈述不正确,请随时纠正我。我认为这是不正确的。当对象脚本对象不是字典时,您的代码试图强制转换到字典[]。它是一个数组。因此它应该强制转换到对象[]。恐怕您忽略了字典[]末尾的括号,它将其定义为字典数组。另外,如果您查看我上面的代码,从Object(它是[]的父类型)强制转换它是不起作用的。Kevin:但这些不是字典,也不是arr