我一直在阅读Joseph Albahari关于C#4.0的精彩书籍,我遇到了这个课程:
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; }
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
}
有人可以向我解释这个功能在做什么以及它是如何工作的?我知道它用于向表达式树添加and
和or
条件,但它实际上是如何工作的?我从未使用像Expression这样的类。这个具体代码在做什么?
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
我知道Func是一个委托,它应该返回true或false但是这个代码一般在做什么?
提前致谢:)
答案 0 :(得分:1)
这是使用Expression Trees从两个表示谓词的输入表达式“构建”谓词。
表达式树是一种使用lambda在树状结构(而不是直接委托)中生成代码表示的方法。这需要两个表示谓词(Expression<Func<T,bool>>
)的表达式树,并将它们组合成一个表示“或”情况的新表达式树(以及第二种方法中的“和”情况)。
表达式树及其相应的实用程序(如上所述)对ORM之类的东西很有用。例如,实体框架使用带有IQueryable<T>
的表达式树将定义为lambda的“代码”转换为在服务器上运行的SQL。