IronJS CommonObject, возможны ли динамические свойства? - PullRequest
2 голосов
/ 24 сентября 2011

В IronJS у нас есть пользовательский объект, полученный из CommonObject.Мы хотим перехватывать вызовы неопределенных свойств объекта и предоставлять динамические ответы.(Это необходимо, поскольку в нашей ситуации невозможно предварительно зарегистрировать все свойства.)

Мы можем перехватить вызовы функций для этого объекта путем переопределения функции BoxedValue Get(string name) и предоставитьфункции "на лету" без предварительной регистрации их на объекте.

Мы надеемся, что сможем сделать то же самое с свойствами , но ни одно из переопределений, похоже, не справится с этим.Я надеюсь, что у кого-то достаточно опыта работы с 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();), но не для свойств.

Любая помощь или предложения будут очень полезныоценили.

1 Ответ

1 голос
/ 15 января 2012

Похоже, что в настоящее время это невозможно (по состоянию на 14.01.12) из-за способа компиляции вызова функции и доступа к свойству.

При вызове функции запрашивается реализация CommonObject для объекта с именем свойства, но обычный доступ к свойствам, похоже, затрагивает только внутренний кэш свойств среды выполнения, а не переопределения объекта.

IПытаясь изменить код, чтобы справиться с этим, вы можете следить за ходом работы в списке рассылки .

После того, как ответ выяснен, можете опубликовать его здесь.Если бы я знал, что F # лучше, вероятно, мог бы добиться большего прогресса, так что если кто-то еще, пожалуйста, помогите:)

...