You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jint 4.2.1:可扩展类中多参数Action的实现问题

Jint 4.2.1 多参数方法注册与调用问题解决

问题对应解决方案

1. 单参数Action无法捕获多参数的问题

单参数Action<T>只能接收JS调用时的第一个参数,剩余参数会被直接丢弃。要处理多参数,直接改用接收Arguments类型的委托——这是Jint专门用来封装JS调用参数的类型:

engine.SetValue("log", new Action<Arguments>(args => {
    foreach (var arg in args)
    {
        Console.WriteLine(arg);
    }
}));

也可以用params object[]让Jint自动将多参数打包成数组:

engine.SetValue("log", (Action<object[]>)((object[] args) => {
    foreach (var arg in args)
    {
        Console.WriteLine(arg);
    }
}));

2. 继承ObjectInstance时多参数调用报错的问题

用FastSetProperty注册方法时,不能直接用普通的params方法,必须适配Jint的参数传递逻辑。同样用Arguments类型接收所有参数即可:

public class CustomConsole : ObjectInstance
{
    public CustomConsole(Engine engine) : base(engine)
    {
        // 注册支持多参数的log方法
        FastSetProperty(
            "log", 
            new Func<Arguments, JsValue>(args => {
                foreach (var arg in args)
                {
                    Console.WriteLine(arg);
                }
                return JsValue.Undefined;
            }), 
            PropertyFlag.Writable | PropertyFlag.Configurable
        );
    }
}

// 注册到引擎
engine.SetValue("console", new CustomConsole(engine));

这样调用console.log('A', 'B', 3, false)就能正常处理所有参数,无需传入数组。

是否需要继承ObjectInstance?

  • 如果只是需要注册支持多参数的方法,优先用普通类+params方法,实现简单,无需处理ObjectInstance的复杂逻辑
  • 如果需要自定义JS对象的高级特性(比如原型链扩展、属性访问拦截、自定义属性描述符),再继承ObjectInstance,此时按上面的方式用Arguments处理多参数即可

内容的提问来源于stack exchange,提问作者Bisjob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:12:12