我想在編譯時類型的上下文/作用域中執行動態表達式(由用戶提供)。 在下面的例子中,context是任意編譯時類型的一個實例。爲了創建評估範圍,我想利用這樣一個事實,即所有可用的屬性及其類型在編譯時已知。如何獲取靜態(編譯時)類型的IDynamicMetaObjectProvider?
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(由於性能原因)
- 添加上下文範圍和改變表達「上下文。 a + context.b「(出於可用性的原因)
我敢肯定,已經有一種獲取IDynamicMetaObjectProvider的機制,但無法弄清楚。
我認爲該事件是否有產生的一類元對象提供者還是有辦法CLR類型提供了一個基本實現,提供靜態成員,這對IronPython作用域來說不是一個普遍有效的實現。對於將新變量添加到範圍的情況,它缺少動態擴展機制(類似於ExpandoObject)。或者這對你的用例是一個實際的功能? – 2012-08-07 18:26:35
我只執行表達式,所以我不能在範圍內賦值或添加變量。但是謝謝你指出添加會失敗。 – Christian 2012-08-11 22:25:47