【问题标题】:How can you pass a JavaScript array to the host with ClearScript?如何使用 ClearScript 将 JavaScript 数组传递给主机?
【发布时间】:2018-06-19 07:17:46
【问题描述】:

我正在尝试将 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
    }
}

【问题讨论】:

    标签: c# embedded-v8 clearscript


    【解决方案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);");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2011-11-07
      • 2016-11-05
      相关资源
      最近更新 更多