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

Jam*_*ler 9 javascript c# browser com

在窗体上使用WebBrowser并使用window.external从Javascript调用C#.传入函数中的Javascript数组类:

var x = [];
x.push(classa);
x.push(classa);

window.external.CSharpFunction(x);
Run Code Online (Sandbox Code Playgroud)

我可以在C#中成功获取x.length:

int length=(int)x.GetType().InvokeMember("length", BindingFlags.GetProperty, null, x, null);
Run Code Online (Sandbox Code Playgroud)

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

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

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

这两个都触发了WebBrowser控件中的错误.

谢谢

Jos*_*hua 5

请看这个问题:

使用C#4中的dynamic类型访问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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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();" />
Run Code Online (Sandbox Code Playgroud)