我一直在阅读表达式树,我认为这是使用它们的一个很好的例子,但我似乎仍然无法掌握这将如何完成。
我有一组要求值的字符串,它们的类型都是
exp == exp , or exp != exp , or exp (<,>,>=,<=) exp if exp is Numerical Type.
exp不需要检查它们是否有效,如果它们无效,我可以接受它们爆炸。
我的问题是,我如何解析得到实际的obj.
我想在
下面传递这样一个字符串Owner.Property.Field == 3;
or
Owner.Field == 3;
or
Owner.Method(1) == true
,求值是否为真。我的问题是我如何沿着左边的"路径"旅行并获得值?
我实现了一个具有反射和字符串解析的版本,它以某种方式完成了工作-除了当我们使用方法时,老实说它根本没有那么高的性能。我希望这是尽可能高性能,如果可能的话,给我一个小的解释表达式是如何工作的,所以我可以学习。
您可以使用代码生成库,如CodeDOM
或Roslyn
来生成执行求值的Func。
例如,在Roslyn
中,您可以创建Session
,并将包含Owner
的对象设置为Session
的Host object
。那么您就可以在Session
中生成您希望的代码,如下所示:
Session session = ScriptEngine.CreateSession(objectContainingOwnerAsProperty);
bool result = session.Execute<bool>("Owner.Field == 8");
现在result
将包含没有reflection
和字符串分析的字符串的计算结果。