我正在 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/