【发布时间】:2012-08-03 22:42:30
【问题描述】:
我想在编译时类型的上下文/范围内执行动态表达式(由用户提供)。 在下面的示例中,上下文是任意编译时类型的实例。为了创建评估范围,我想利用所有可用属性及其类型在编译时已知的事实。
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 的机制,但无法弄清楚。
【问题讨论】:
-
我认为如果有一种方法可以为类生成元对象提供程序,或者有一个 CLR 类型的基本实现提供静态成员,这对于IronPython 范围。对于将新变量添加到范围的情况,它缺少动态扩展机制(类似于 ExpandoObject)。或者这会是您的用例的实际功能吗?
-
我只执行表达式,所以我不能在范围内分配或添加变量。但是感谢您指出添加会失败。
标签: c#-4.0 ironpython dynamic-language-runtime linq-expressions