转换JavaScript双精度数组
的最佳方法是什么?return [2.145, 1.111, 7.893];
当从webbrowser控件文档对象返回Javascript数组时,进入双打.NET数组
object o = Document.InvokeScript("getMapPanelRegion");
不使用字符串和解析?
返回的对象是__ComObject类型,因为它是一个返回的数组。该数组将是一个固定的大小,因为我使用它来返回三个值回到调用代码。我目前的解决方案是返回一个|三个值的字符串,我然后拆分并解析字符串以获得我的三个双打。如果可能的话,我不想使用字符串操作,因为这感觉就像一个黑客。
答案 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;
}