最近在做Silverlight应用,需要用Silverlight调用页面中Javascript方法。这 个JS方法返回一个对象数组给Silverlight。对于这个对象数组怎么在Silverlight里处理这个问题纠结了一阵子,通过搜索,在微软开发 者社区里找到了方法。

测试用的JS方法如下:

   1: function test() {
   2:     var testObjectCollection = [];
   3:     for (var i = 0; i < 10; i++) {
   4:         var testObject = new Object();
   5:         testObject.Field1 = "Field1_" + i;
   6:         testObject.Field2 = "Field2_" + i;
   7:         testObjectCollection[testObjectCollection.length] = testObject;
   8:     }
   9:     return testObjectCollection;
  10: };

代码中设计了一个对象testObject,对象包含两个属性Field1和Field2。因此会很容易想到在Silverlight也创建一个结构相同的类:

   1: public class TestObject
   2: {
   3:     public string Field1 { get; set; }
   4:     public string Field2 { get; set; }
   5: }

准备工作到这里结束。

在Silverlight里调用JS方法的代码如下:

   1: object returnedValue = HtmlPage.Window.Invoke("test", null);

第一个参数是JS方法名,第二个参数是params object[]类型的,是JS方法的参数列表。Invoke方法返回值的是object类型,很容易想到会用下面的方法转换:

   1: List<TestObject> testObjectCollection = returnedValue as List<TestObject>;

但是会发现testObjectCollection变量是null,而returnedValue并不为null,转换失败了。

通过调试发现,returnedValue类型为 System.Windows.Browser.ScriptObject,也就是说Invoke方法返回值实际上是不单纯是个object,而是 ScriptObject。ScriptObject类有个ConvertTo方法可以用来转换。关于System.Windows.Browser.ScriptObject类型详细信息,可以去查MSDN。

于是我尝试如下方法:

   1: ScriptObject returnedValue = HtmlPage.Window.Invoke("test", null) as ScriptObject;
   2: List<TestObject> objects = returnedValue.ConvertTo<List<TestObject>>();

调试结果如下:

很明显,转换成功了。剩下的事情就是按业务需求来处理了。

(转)Silverlight调用的JS方法返回对象数组的处理方法的更多相关文章

  1. js通过方法返回对象的注意点

    问题:js通过方法返回一个字面量对象和返回一个提前已经定义好的字面量对象有区别吗? 答案:有 我们先来看看第一种情况,fun1方法返回一个提前没定义的字面量对象,然后通过调用方法返回三个对象,分别是o ...

  2. js中字符串和数组相互转化的方法

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #e4af0a } p. ...

  3. JS 两个对象数组合并并去重

    JS两个对象数组合并并去重 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. iOS js oc相互调用(JavaScriptCore)---js调用iOS --js里面通过对象调用方法

    下来我们看第二种情况 就是js 中是通过一个对象来调用方法的. 此处稍微复杂一点我们需要使用到 JSExport 凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通 ...

  5. JS对象 数组连接 concat() 方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。 语法 arrayObject.concat(array1,array2,.arrayN)

    concat() 方法用于连接两个或多个数组.此方法返回一个新数组,不改变原来的数组. 语法 arrayObject.concat(array1,array2,...,arrayN) 参数说明: 注意 ...

  6. js注意点:数组比较大小方法及数组与对象的区别

    (迁移自旧博客2017-04-19) 快速复制数组及数组比较大小方法 首先介绍一下复制数组的方法: var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; var ...

  7. js中json对象数组按对象属性排序(sort方法)---2(根据拼音排序汉字和排序英文)

    本例主要实现 中文汉字按拼音排序的方法和英文按照首字母排序的方法. 要排序的数据: //要排序的数据 let data = [ {chinese: '蔡司', english: 'Chase'}, { ...

  8. js常用返回网页顶部几种方法

    一.使用锚标记 此方法最简单,只需在body下放个隐藏的锚点标记,内容如下:  代码如下 复制代码 <a name="top" id="top">& ...

  9. Object.keys()方法 返回对象属性数组

    MDN语法 Object.keys(obj) 参数obj:要返回其枚举自身属性的对象. 返回值:一个表示给定对象的所有可枚举属性的字符串数组. 1.传入一个对象,返回的的是所有属性值 var obj2 ...

随机推荐

  1. c# vs2013部署项目

    http://demo.netfoucs.com/shinepan/article/details/24865931

  2. 如何设置java环境变量

    以安装目录是E:\Program Files\Java\jDK1.7.0为例:

  3. Unity3D脚本学习——运行时类

    AssetBundle 类,继承自Object.AssetBundles让你通过WWW类流式加载额外的资源并在运行时实例化它们.AssetBundles通过BuildPipeline.BuildAss ...

  4. TensorFlow 语法

    dataset = tf.data.TextLineDataset(file_path) 生成一个dataset,dataset中的每一个元素就对应了文件中的一行

  5. git gitlab 使用 提交代码解决冲突

    1.更改完代码后,git push 发生错误 注: 此时,使用 git pull: 更新代码,git 会自动merge不同的更新, a.  如果git 自动merge成功,再进行 git push操作 ...

  6. javascript中scrollTop和offsetTop的区别

    scrollTop是指某个可滚动区块向下滚动的距离,offsetTop则是元素的上边框与父元素的上边框的绝对距离. 1.offsetTop   : 当前对象到其上级层顶部的距离. 不能对其进行赋值.设 ...

  7. Python基础之Python分类

    python环境 编译型: 一次性将所有程序编译成二级制文件,开发效率极低,因为一旦出现BUG所有的程序需要全部重新编译 缺点: 开发效率低,不能跨平台 优点: 执行速度快 解释型: 当程序执行时,一 ...

  8. NDK环境搭建方法2

    1.新建项目NDKDemo3 2.新建com.example.shixm.ndkdemo3.MyNdk.java 3.右键main文件夹,New->Folder->JNI Folder 4 ...

  9. UVa 122 Trees on the level(二叉树层序遍历)

    Trees are fundamental in many branches of computer science. Current state-of-the art parallel comput ...

  10. 第五章 Inheritance继承

    [继承] Java不支持多重继承 - 每个子类只有一个超类. 不是将成员变量声明为静态,更好的做法是将University实例化为对象,然后使用该对象访问其成员,如下所示: [抽象类] 可以包含或者不 ...