http://www.cnblogs.com/sosowjb/archive/2012/06/02/2532237.html
最近在做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>>();
調試結果如下:
很明顯,轉換成功了。剩下的事情就是按業務需求來處理了。