コンパイル時の型のコンテキスト/スコープで動的式(ユーザー提供)を実行したい。以下の例では、コンテキストは任意のコンパイル時タイプのインスタンスです。評価用のスコープを作成するために、利用可能なすべてのプロパティとそのタイプがコンパイル時にわかっているという事実を利用したいと思います。
var engine = IronPython.Hosting.Python.CreateEngine();
var func = engine.CreateScriptSourceFromString("a + b").Compile();
var context = new { a = 1, b = 2 };
var scope = engine.CreateScope((IDynamicMetaObjectProvider)context); // Fails to compile
var result = func.Execute(scope);
context.a = 5;
var result2 = func.Execute(scope);
私が取りたくない解決策は次のとおりです。
- コンテキストがDynamicObjectから継承し、GetMemberを上書きするようにします(パフォーマンス上の理由から)
- スコープにコンテキストを追加し、式を「context.a + context.b」に変更します(使いやすさの理由から)
確かに、IDynamicMetaObjectProviderを取得するためのメカニズムはすでに存在しますが、それを理解することはできませんでした。