【问题标题】:IronJS CommonObject, are dynamic properties possible?IronJS CommonObject,动态属性可能吗?
【发布时间】:2011-09-23 20:22:47
【问题描述】:

在 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();),但不是为属性调用的。

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

【问题讨论】:

标签: .net dynamic-language-runtime ironjs


【解决方案1】:

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

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

我正在尝试修改代码以处理此问题,您可以在mailing list 上关注进度。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多