C#表达式树 - 动态值查找

时间:2009-08-10 13:34:11

标签: c# linq

我正在构建一个C#表达式树来评估简单表达式。表达式字符串被解析为树,并通过使用parantheses来尊重基本运算符(数学,逻辑和关系)以及优先级。

除了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

1 个答案:

答案 0 :(得分:2)

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

如果它对您有用,我最近回答了一个similar question,其中包含一些源代码。它可能不会立即可用,但它应该是一个良好的开端。

编辑:我不确定表达树在这里对你有多大用处。特别是PropertyExpression包含相关的PropertyInfo,因此需要知道它正在使用的类型。如果类型可能会针对每个值进行更改,则必须为每个值重建表达式树...