【问题标题】:How to convert a JavaScript array of doubles to a .NET array of doubles?如何将 JavaScript 的双精度数组转换为 .NET 的双精度数组?
【发布时间】:2009-10-01 07:43:43
【问题描述】:

转换双精度 JavaScript 数组的最佳方法是什么

return [2.145, 1.111, 7.893];

当 Javascript 数组从网络浏览器控件文档对象返回时,转换为 .NET 的双精度数组

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

不使用字符串和解析?

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

【问题讨论】:

    标签: c# .net javascript browser


    【解决方案1】:

    来自MSDN (HtmlDocument.InvokeScript Method)

    InvokeScript 返回的对象的基础类型会有所不同。如果调用的 Active Scripting 函数返回标量数据,如 stringinteger,则返回 string ...

    似乎整数将作为字符串返回,您可以假设这同样适用于双精度数。

    编辑: 我忘了你说的是数组。无论如何,MSDN 继续:

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

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

    编辑 2:

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

    【讨论】:

    • 但是我有一个双打数组,它们的处理方式不同。
    • 问题是将 __ComObject 放入我的 .NET 数组中。
    • 我同意 hack 有时是最好的解决方案,但是一旦我探索了尽可能多的可能性,我会感觉更好。
    【解决方案2】:

    这个“问题”相当于将 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多