如何计算一个简单的 C# 字符串
How to evaluate a simple C# string
我一直在阅读表达式树,我认为这是使用它们的一个很好的例子,但我似乎仍然无法理解如何做到这一点。
我有一组要评估的字符串,它们都是以下类型:
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
并获取评估是否正确。我的问题是如何沿着左侧的 "path" 行进并获取值?
我实现了一个带有反射和字符串解析的版本,它以某种方式完成了工作——除了我们使用方法的时候,老实说,它根本不是那么高效。我希望它尽可能地高效,如果可能的话给我一个关于表达式如何工作的小解释,这样我就可以学习。
您可以使用 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
或字符串分析。
我一直在阅读表达式树,我认为这是使用它们的一个很好的例子,但我似乎仍然无法理解如何做到这一点。
我有一组要评估的字符串,它们都是以下类型:
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
并获取评估是否正确。我的问题是如何沿着左侧的 "path" 行进并获取值?
我实现了一个带有反射和字符串解析的版本,它以某种方式完成了工作——除了我们使用方法的时候,老实说,它根本不是那么高效。我希望它尽可能地高效,如果可能的话给我一个关于表达式如何工作的小解释,这样我就可以学习。
您可以使用 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
或字符串分析。