Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不';我的JavaScript数组不能转换为适当的类型吗?_C#_Javascript_.net_Silverlight_Htmlbridge - Fatal编程技术网

C# 为什么不';我的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},

我在通过HTMLBridge将JavaScript数组和字典类型对象传递给托管代码中的方法时遇到了一些问题。网络内外的信息让我一事无成

使用链接文章中的以下信息:

NET Framework属性或输入参数类型为对象 在按值封送到 目标.NET Framework属性或输入参数:

JavaScript数组被转换为
对象[]

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#as
dictionary

这些尝试是由于对上述文章及其他文章中的信息的误解造成的吗?还是我的实现根本不正确

附录:

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
    ,因为这是它派生的类)
  • 目标属性或方法参数的类型必须使用HtmlPage.RegisterCreatableType显式或隐式注册,并且传递的值必须是使用注册别名(
    createObject
    )或类型调用
    createManagedObject
    产生的对象(
    createManagedObject

  • 如果我所做的任何陈述不正确,请随时纠正我。

    我认为这是不正确的。当对象脚本对象不是字典时,您的代码试图强制转换到字典[]。它是一个数组。因此它应该强制转换到对象[]。恐怕您忽略了字典[]末尾的括号,它将其定义为字典数组。另外,如果您查看我上面的代码,从Object(它是[]的父类型)强制转换它是不起作用的。Kevin:但这些不是字典,也不是arr