2009-08-10 71 views
2

我正在构建一个C#表达式树来评估简单表达式。表达式字符串被解析为树,并且尊重基本的操作符(数学的,逻辑的和关系的),并且通过使用偏差来优先考虑。C#表达式树 - 动态值查找

除了bool,string和integer类型之外 - 我需要在运行时对表达式的一些元素进行评估。这些是通过模板串表示,例如:

([firstname] == "bob") && ([surname] == "builder") 

以上表达式将用于提供用于当前表达式调用的上下文中,例如,在一个循环的对象的(潜在大)数来评价。模板部分将在当前上下文中反射使用 - 例如,在示例中将解析当前用户的名字和姓氏,并在表达式解析中使用这些值而不是模板化字符串。

一个解决方案是在解析时解析模板值,这样可以使用常量表达式类型,并且值的类型将是已知的。但是,重新构建和重新编译表达式树每个都会对性能造成影响。

所以,我需要一个表达式类型,其: - 值类型是不是在分析时已知的, - 这是一个方法调用在调用时解析

E.g. Desired example of usage in pseudo code 
ExpressionParser parser = new ExpressionParser(); // parses and builds expression trees 
MyParsedExpression expression = parser.Parse("([firstname] == 'bob') && ([surname] == 'builder'"); // wrapper for the parsed expression 
foreach (Object user in users) 
{ 
    expression.Context = user; 
    Boolean result = expression.EvaluateTruth(); 
    if (result == true) 
    { 
     // do something 
    } 
} 

感谢, fturtle

回答

2

使用​​表示传入参数。至于类型异常......当您构建表达式树时,您是否知道数据的类型?如果没有,那会让事情变得更加困难......

如果它对您有任何用处,我最近回答了一个similar question,附带一些源代码。它可能不是立即可用,但它应该是一个好的开始。

编辑:我不确定表达树会在这里非常有用。特别是PropertyExpression包含相关的PropertyInfo,所以它需要知道它正在使用的类型。如果类型可能为每个值更改,则必须为每个值重建表达式树...

+0

为响应而欢呼。我不确定参数表达式能够帮助我,因为表达式可以嵌套,并且可以包含任意数量的模板值。此外,构建表达式树时不知道类型。总之,我想我是在某种委托表达之后。 – fturtle 2009-08-10 14:01:27

+0

恐怕不是很清楚你想要做什么,什么时候知道什么信息。你有没有解析事物的一面? *你有什么信息?你有什么信息?你能否存储一些中间形式,让你稍后建立一个强类型的表达式树? – 2009-08-10 14:19:41