我有这个
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*/)
答案 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();
请记住,表达式编译过程非常昂贵。如果可以,请缓存结果。