执行表达式的集合

时间:2017-02-10 16:08:25

标签: c#

我有这个

   List<Expression> levl1expressions;

Collection包含二进制表达式,如Expression.NotEqual,Expression.Equal 等

我有另一个集合,即And And Or Conditions

List<Expression> levl2expressions;

我想执行这两个表达式集合

levl1expressions[0]+levl2expressions[0]+levl1expressions[1]+levl2expressions[1]....

这可能吗?

例如:

object.Name = "something" && object.Category != "myCategory"(//I transformed the string to expressions)

levl1expressions[0] = Expression.Equal(
               Expression.Property(Expression.Parameter(typeof(MyObject), "m")), 
               Expression.Constant("something")
levl1expressions[1] = Expression.NotEqual(....)

levl2expressions[0]= Expression.And(/*Would like to join levl1expressions*/)

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您根本不应该使用列表。相反,您可以创建一个看起来像这样的表达式:

var finalExpression = Expression.And(Expression.Equal(...), Expression.NotEqual(...));

如果您想组合更多逻辑运算符,那么您可以使用Expression.And的结果作为正确的操作数:

var finalExpression = Expression.And(Expression.Equal(...), Expression.And(Expression.NotEqual(...), Expression.Equal(...)));

要调用首先需要编译的表达式:

var action = Expression.Lambda<Action<bool>>(finalExpression).Compile();

此处Action<bool>指定您创建的功能类型。 Action<bool>基本上是指一个返回布尔值且没有参数的函数。一旦你有了,你可以简单地称它:

var result = action();

请记住,表达式编译过程非常昂贵。如果可以,请缓存结果。