c# - 将 JavaScript 自定义类型从 InvokeScript 返回到 C#,并保留自定义类型结构

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

我正在 WebBrowser 控件上使用 InvokeScript,尝试使用适用于 HTML 的 Google Maps JavaScript API 制作简单的 map 。我在 JavaScript 的 HTML 页面中编写了一些函数来处理 map ,并且我在 C# 的 WPF 应用程序中复制了这些方法并对其进行了编辑,以便它们调用方法并执行与 JavaScript 交互所需的操作。

我遇到了问题,因为 map 的 javascript 返回的值并非都是简单的单值类型(如字符串、整数或 bool 值),并且返回自定义类型(如 LatLng),而且我不知道如何“保留”返回的值作为自定义类型的单独“部分”。为了帮助解释更多:

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

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

它在 JavaScript 中调用以下函数:

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

并返回 map 当前标题属性的简单整数值。这很容易,而且没有任何问题。但有些函数具有自定义的返回类型。

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

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

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

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

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

最佳答案

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

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

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

关于c# - 将 JavaScript 自定义类型从 InvokeScript 返回到 C#,并保留自定义类型结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21941440/

相关文章:

c# - 将 EntityFramework 6.0.0.0 还原为 5.0.0.0

c# - 类数组初始化类C#

javascript - 从 angularjs 调用 javascript 时出错

c# - 绑定(bind)到 xaml 中枚举的显示名称属性

c# - 连接mysql最好的驱动是什么?

javascript - 导入 Electron 时,fs.existsSync 不是一个函数

javascript - 让 Famo.us ScrollView 滚动到末尾

c# - 无法清除组合框中的选择

c# - 将两个复选框绑定(bind)到 MVVM 中的可为 null 的 bool 属性

c# - MySQL/C# 插入问题