2

在 IronJS 中,我们有一个从 CommonObject 派生的自定义对象。我们希望拦截对对象上未定义属性的调用,并提供动态响应。(这是必需的,因为在我们的情况下不可能预先注册所有属性。)

我们可以通过重写函数来捕获对该对象的函数调用BoxedValue Get(string name),并“即时”提供函数,而无需在对象上预先注册它们。

我们希望我们可以对properties做同样的事情,但似乎没有一个覆盖能够处理这个问题。我希望有人对 IronJS 有足够的经验来建议我们如何更好地解决这个问题。

希望这能阐明我们正在努力实现的目标:

IronJS.Hosting.CSharp.Context ctx = new IronJS.Hosting.CSharp.Context();
ctx.SetGlobal("data", new MyCustomObject());
string script = @"var x = data.mydynamicproperty;";
ctx.Execute(script);

当脚本执行时,我们希望能够覆盖并返回自定义值。例如(在 MyCustomObject 类声明中):

public override BoxedValue Get(string name) {
    if (name == "mydynamicproperty") {
        return BoxedValue.Box("test");
    }
}

上面的覆盖是为函数(例如var x = data.mydynamicfunction();)调用的,但不是为属性调用的。

任何帮助或建议将不胜感激。

4

1 回答 1

1

由于函数调用和属性访问的编译方式,目前似乎不可能(截至 2012 年 1 月 14 日)。

函数调用似乎要求CommonObject实现具有属性名称的对象,但正常的属性访问似乎只命中运行时的内部属性缓存,而不是对象的覆盖。

我正在尝试修改代码以处理此问题,您可以关注邮件列表上的进度。

找到答案后,可以在这里发布。如果我更好地了解 F# 可能会取得更好的进展,所以如果其他人知道,请贡献:)

于 2012-01-14T23:29:01.050 回答