如何将JavaScript双精度数组转换为双精度.NET数组?

时间:2009-10-01 07:43:44

标签: c# .net javascript browser

转换JavaScript双精度数组

的最佳方法是什么?
return [2.145, 1.111, 7.893];
当从webbrowser控件文档对象返回Javascript数组时,

进入双打.NET数组

object o = Document.InvokeScript("getMapPanelRegion");

不使用字符串和解析?

返回的对象是__ComObject类型,因为它是一个返回的数组。该数组将是一个固定的大小,因为我使用它来返回三个值回到调用代码。我目前的解决方案是返回一个|三个值的字符串,我然后拆分并解析字符串以获得我的三个双打。如果可能的话,我不想使用字符串操作,因为这感觉就像一个黑客。

2 个答案:

答案 0 :(得分:1)

来自MSDN (HtmlDocument.InvokeScript Method)

  

InvokeScript返回的对象的基础类型会有所不同。如果被调用的活动脚本函数返回标量数据,例如字符串整数,它将作为字符串 ... <返回/ p>

似乎整数将作为字符串返回,你可以认为这同样适用于双打。

修改 我忘了你在谈论阵列。无论如何,MSDN继续:

  

...如果它返回一个基于脚本的对象,例如使用JScript或VBScript的新运算符创建的对象,它将是对象类型...

所以看起来你会得到一个对象,但这无助于你必须在C#代码中转换它。

编辑2:

至于实际ComObject的转换。在阅读了关于Excel的this之后,它仍然返回一个ComObject,看起来你当前对字符串的看法似乎更简单了。有时黑客是最好的解决方案:D

答案 1 :(得分:0)

这个“问题”相当于将VARIANT转换为C#数组。对于这可能最简单的方法是使用反射。方法如下:

private static IEnumerable<object> SafeArrayToEnmrble (object comObject)
{
    Type comObjectType = comObject.GetType();
    // spot here what is the type required
    if (comObjectType != typeof(object[,]))
    // return empty array, throw exception or whatever is your fancy
        return new object[0];

    int count = (int)comObjectType.InvokeMember("Length", BindingFlags.GetProperty, null, comObject, null);
    var result = new List<object>(count);

    var indexArgs = new object[2];
    for (int i = 1; i <= count; i++)
    {
        indexArgs[0] = i;
        indexArgs[1] = 1;
        object valueAtIndex = comObjectType.InvokeMember("GetValue", BindingFlags.InvokeMethod, null, comObject, indexArgs);
        result.Add(valueAtIndex);
    }

    return result;
}