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

9

在窗体上使用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});

这两个问题都可能导致WebBrowser控件出现错误。

谢谢。


尝试调用“0”成员?(就像使用“length”成员一样。) - user166390
"0" 也会导致错误。 - Jamie Mueller
1个回答

5
请查看这个SO问题:

使用C# 4中的dynamic类型访问javascript对象的属性

我也尝试过从数组中检索对象属性的值,但没有成功。检索数组中的简单值(如字符串和整数)很容易,但是在复杂对象方面一直没有成功。

我认为最好的方法是实现与上述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();" />

我本来想避免这个,但现在看起来这是最简单的结果。我只是写了一个简单的JavaScript函数:function GetItem(array,index) { return array[index]; }然后从C#中调用它:_webBrowser.Document.InvokeScript("GetItem", new object[2] { array, index }); - Jamie Mueller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接