

C#で[Jint](https://github.com/sebastienros/jint)を用いて開発をしています。

開発していてJintのエンジン内にいる変数(データ)が書き換わったら別の処理をしたいと思い、試行錯誤していたのですがSetter/Getterの設定の仕方が分からず、毎回問い合わせて変更がある見るという効率の悪い形になってしまいました。

コードの例を載せます。

[code]

    engine = new Engine();
    engine.Execute("var hoge = { x: 1, fuga: function() { this.x++; } }");
    var hoge = engine.GetValue("hoge");
    var x = hoge.Get("x");
    var fuga = hoge.Get("fuga");
    fuga.Invoke(hoge, new JsValue[]{});
    // ここでhoge.xが変わったかを再度取得して見てます
    var x2 = hoge.Get("x");
    if (x != x2) {
        // xは変更されている
    }
    
[/code]

JintにSetter/Getterを設定する方法があるかどうかは分かりませんが、もし可能なら方法を教えていただけると嬉しいです。

【追記(2020/01/15)】  
・js側でgetter/setterを設定すれば良いという指摘があったので、詳細を説明します。  
・ユーザが入力したJsをJintで解釈して動作するプログラムを作っています。  
・そのJs内に関数があるのですが、これによって値がどう変更されたかを知るために、現在は関数実行後にもう一度同じ値を取得して比較するという方法をとっています。効率が悪いです。  
・ユーザが入力するJsの形式は既に決まっているので、setter/getterをJs側で書いておくことは難しいです


CC BY-SA 4.0
2020-01-14T05:16:12.140
62223
2020-01-15T15:37:43.980
2020-01-15T07:19:46.270
31396
31396
question
c#
Jintでデータのsetter/getterを設定する方法が知りたい


[Jint](https://github.com/sebastienros/jint) ダウンロードして 詳細確認してみました。

Jint は JavaScript の インタープリタ で 変数の値の書き換え処理は

`Jint.Engine` クラスの  
`PutValue` メソッドで行っています。

いろいろ試した限りでは JavaScript の処理に影響を与えずに setter の処理に割り込むのは 難しいようです。

ソースが 公開されているので、いっそのこと `Jint.Engine` クラスを拡張して PutValue メソッドを  
改造してみてはいかがでしょうか？

案としては Engine に ValueBeforChangeEventHandler を付けて PutValue の 入口で  
そのイベントハンドラを呼び出す。

というのはいかがでしょうか？


CC BY-SA 4.0
2020-01-15T15:37:43.980
62272
2020-01-15T15:37:43.980
18851
62223
answer