获取JavaScript自定义类型从InvokeScript返回到C#并保留自定义类型结构

时间:2014-02-21 17:42:26

标签: c# javascript wpf google-maps webbrowser-control

我在WebBrowser控件上使用InvokeScript尝试使用适用于HTML的Google Maps JavaScript API创建一个简单的地图。我在JavaScript的HTML页面中编写了一些函数来处理地图,我在C#中的WPF应用程序中复制了这些方法,并对它们进行了编辑,因此他们调用方法并执行他们需要做的与JavaScript接口的操作。

我遇到了问题,因为javascript为地图返回的所有值都不是简单的,单值类型如字符串,整数或布尔值,并返回自定义类型,如LatLng,我不知道如何“保存”返回的值作为自定义类型的单独“部分”。为了帮助解释更多:

通常我可以使用以下代码:

return Convert.ToInt16(browser.InvokeScript("getHeading"));

在JavaScript中调用以下函数:

function GetHeading() {
    return map.getHeading();
}

并为地图的当前标题属性返回一个简单的整数值。这很简单,没有问题。但是某些函数具有自定义的返回类型。

LatLng类型由纬度值和经度值组成,因此它不能返回简单值,如果我尝试使用此帖子的第一个代码片段,则会抛出错误。对于某些功能,如下所示:

function GetCentre() {
    return map.getCenter();
}

返回包含地图中心的纬度和经度的LatLng。如何保留返回的值并将其保存为经度和经度,然后将这些放入C#中的自定义类型,如下所示:

public class LatLng
{
    public string latitude { get; set }
    public string longitude { get; set; }
}

我是否必须在javascript端编写两个单独的函数?:一个用于返回中心的纬度而另一个用于返回它的经度。基本上我想要做的是在WebBrowser控件上使用InvokeScript,调用返回自定义类型的javascript函数,并将值保存在我可以在C#中使用的自定义类型中,如returnedValue.latitude和returnedValue.longitude。我怎么能这样做,谢谢?

2 个答案:

答案 0 :(得分:1)

只需使用C#和.NET DLR的dynamic功能,并按原样返回JavaScript结构:

dynamic data = webBrowser1.Document.InvokeScript("eval", new[] { 
    "(function() { return { latitude: 1, longitude: 2 }; })()" });

MessageBox.Show("Data: " + data.latitude + ", " + data.longitude);

答案 1 :(得分:0)

正如Noseration所说:

JavaScript :

    function getCameraPosition() {
      return map.getCenter().toJSON();
    }

C# :
    object[] o = new object[] {};
    dynamic res = googleMapWB.Document.InvokeScript("getCameraPosition", o);
    Console.WriteLine(res.lat+","+res.lng);
在这种情况下,

res.lat和res.lng已经翻了一倍。