我想在编译时类型的上下文/作用域中执行动态表达式(由用户提供)。 在下面的例子中,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