我一直在阅读表达树,我认为这是使用它们的一个很好的例子,我仍然无法理解如何做到这一点。
我有一组我想要评估的字符串,它们都是以下类型:
exp == exp , or exp != exp , or exp (<,>,>=,<=) exp if exp is Numerical Type.
exp不需要检查它们是否有效我很好,如果不是它们会爆炸。
我的问题是,如何解析以获得实际的对象。
我想传递下面的字符串
Owner.Property.Field == 3;
or
Owner.Field == 3;
or
Owner.Method(1) == true
如果评估是真的,那就得到。我的问题是如何沿着&#34;路径前进?在左边并获得值?
我实现了一个带有Reflection和字符串解析的版本,它以某种方式完成了工作 - 除了我们使用方法的时候,老实说它本身并不是那么高效。我希望这能尽可能高效,如果可能的话,给我一个关于表达式如何工作的小解释,这样我就可以学习。
答案 0 :(得分:3)
您可以使用代码生成库(如CodeDOM
或Roslyn
)生成将执行评估的Func。
例如,在Roslyn
中,您可以创建Session
并将包含Owner
的对象设置为Host object
的{{1}}。您可以按照以下方式生成Session
中的代码:
Session
现在Session session = ScriptEngine.CreateSession(objectContainingOwnerAsProperty);
bool result = session.Execute<bool>("Owner.Field == 8");
将包含不带result
字符串的评估结果,也不包含字符串分析。