2011-10-24 56 views
0

我想知道我如何訪問由C#中的web瀏覽器控件內運行的JavaScript函數返回的對象的屬性。從C#運行在瀏覽器控制中的java腳本返回的對象#

下面是完整的上下文:

我想創建一個基於OpenStreetMap的開放層JavaScript庫一個C#映射控制。 OSM地圖顯示在webbrowser元素內部顯示的網頁中。我使用InvokeScript來通過調用開放圖層庫的簡化Java腳本包裝來控制地圖。一切工作正常。

在C#包裝器中,我想實現一個函數,返回當前正在顯示的地圖的中心座標,並顯示在瀏覽器控件中。到目前爲止,我只用一個相當不合理的解決方案:

在我的C#包裝我有兩個函數,我需要兩個爲了查詢地圖中心。首先我有一個名爲GetCenter功能,它使用InvokeScript調用JavaScript函數,後者又調用另一個C#函數(SetCenterFromJScript)設置地圖中心在我的C#包裝:

public Coord GetCenter() 
{ 
    object center = webBrowser.Document.InvokeScript("set_center_in_wrapper"); 

    // I'm stuck here: 
    Type type = center.GetType(); 
    PropertyInfo[] pi = type.GetProperties(); 

    // I already get the center as an object, but how can i access the 
    // properties "lon" and "lat" directly so that i can get rid of m_center 
    // and SetCenterFromJScript alltogether? 

    return m_center; 
} 

public void SetCenterFromJScript(double lon, double lat) 
{ 
    m_center.lon = lon; 
    m_center.lat = lat; 
} 

的Java腳本的功能是通過調用C#如下圖所示的ObjectForScripting機制:

function set_center_in_wrapper() 
{ 
    var center = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), 
             new OpenLayers.Projection("EPSG:4326")) 

    window.external.SetCenterFromJScript(center.lon, center.lat); 
    return center // <- useless at the moment since i don't know how to access the data from C# 
} 

目前的返回值是沒有用的,我使用SetCenterFromJScript提交的座標。我如何直接從C#訪問中心的屬性「lon」和「lat」?

在此先感謝,任何幫助表示讚賞。

回答

0

嘗試使用InvokeMember獲取中心的屬性。例如:

object center = webBrowser.Document.InvokeScript("set_center_in_wrapper"); 
Type type = center.GetType(); 
Int32 lon = (Int32) type.InvokeMember("lon", 
      BindingFlags.DeclaredOnly | 
      BindingFlags.Public | BindingFlags.NonPublic | 
      BindingFlags.Instance | BindingFlags.GetField, null, center, null); 
Int32 lat = (Int32) type.InvokeMember("lat", 
      BindingFlags.DeclaredOnly | 
      BindingFlags.Public | BindingFlags.NonPublic | 
      BindingFlags.Instance | BindingFlags.GetField, null, center, null); 

我沒有在這種情況下檢查此代碼,因此您可能需要使用綁定標誌來播放aroudn。

+0

非常感謝你!這是小修改:在我的情況下,類型是雙重的,我必須使用BindingFlags.GetProperty而不是BindingFlag.GetField。 –

相關問題