如何使用ClearScript将JavaScript数组传递给主机?

时间:2018-06-19 07:17:47

标签: c# embedded-v8 clearscript

我正在尝试将JavaScript数组传递给宿主函数,但是找不到有关如何使用ClearScript执行此操作的文档。我原以为它会这么简单,但事实并非如此。

public class myHostType
{
    public static void print(string format, object[] args)
    {
        //TODO: implement print
    }
}
...
engine.addHostType("console", typeof(myHostType));
engine.Execute("console.print('Hello', ['World', 42])");

使用此代码,我得到Error: The best overloaded method match for V8SScript1.myHostType.print(string, object[])' has some invalid arguments.'

这是我能找到最接近解决方案的东西。有没有更好的方法呢?

public class myHostType
{
    public static void print(string format, dynamic args)
    {
        var realArgs = new Object[args.length];
        for (int i = 0; i < realArgs.Length; ++i)
        {
            realArgs[i] = args[i];
        }
        //TODO: implement print
    }
}

1 个答案:

答案 0 :(得分:1)

ClearScript不会自动转换数组,因此您必须像平常一样自己做。

您也可以在脚本端进行转换:

engine.AddHostObject("host", new HostFunctions());
engine.Execute(@"
    Array.prototype.toClrArray = function () {
        var clrArray = host.newArr(this.length);
        for (var i = 0; i < this.length; ++i) {
            clrArray[i] = this[i];
        }
        return clrArray;
    };
");
...
engine.Execute("console.print('Hello {0} {1}', ['World', 42].toClrArray());");

但是在这种情况下,使用params可能有意义:

public class myHostType {
    public static void print(string format, params object[] args) {
        Console.WriteLine(format, args);
    }
}
...
engine.Execute("console.print('Hello {0} {1}', 'World', 42);");