从 C# 访问 JavaScript 数组元素(通过 WebBrowser)

本文关键字:通过 WebBrowser 数组元素 访问 JavaScript | 更新日期: 2023-09-27 18:36:17

在表单上使用WebBrowser并使用window.external从Javascript调用C#。在函数中传入一个 Javascript 类数组:

var x = [];
x.push(classa);
x.push(classa);
window.external.CSharpFunction(x);

我可以通过以下方式在 C# 中成功获得 x.length:

int length=(int)x.GetType().InvokeMember("length", BindingFlags.GetProperty, null, x, null);

我的问题是我如何获得 x[0] 和 x[1]?我试过了

x.GetType().InvokeMember(string.Empty, BindingFlags.GetProperty, null, x, new object[1]{1});

x.GetType().InvokeMember(string.Empty, BindingFlags.InvokeMethod | BindingFlags.Default, null, x, new object[1]{0});

这两者都会在 Web 浏览器控件中触发错误。

谢谢

从 C# 访问 JavaScript 数组元素(通过 WebBrowser)

请看这个SO问题:

在 C# 4 中使用动态类型访问 JavaScript 对象的属性

我还尝试从数组中对象的属性中检索值,但没有成功。 检索数组中的简单值(如字符串和整数)很容易,但对于复杂对象却没有运气。

您最好的选择(IMO)是实施与上述SO问题中类似的解决方案。 不要直接传递数组,而是构建一个可以从 C# 调用的 Javascript 方法,该方法将返回数组中指定索引处的对象。 这样:

C#

public void CSharpFunction(dynamic length)
{
    for (int i = 0; i < length; i++)
    {
        dynamic obj = webBrowser1.Document.InvokeScript("getObj", new object[] { i });
        string val = obj.MyClassValue;
    }
}

HTML/JavaScript

<script type="text/javascript">
var x = [];
x.push({MyClassValue: "Hello"});
x.push({MyClassValue: "People"});
function test() {
  window.external.CSharpFunction(x.length);
}
function getObj(i) {
  return x[i];
}
</script>
<button onclick="test();" />