我正在使用来自http://www.albahari.com/nutshell/predicatebuilder.aspx的 PredicateBuilder 类
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);
}
此扩展方法使用 OR 运算符链接谓词。在页面上,解释说
我们首先使用第一个表达式的参数调用第二个表达式。Invoke 表达式使用给定的表达式作为参数调用另一个 lambda 表达式。我们可以从第一个表达式的主体和第二个表达式的调用版本创建条件表达式。最后一步是将其包装在一个新的 lambda 表达式中。
所以如果例如我有
Predicate<Book> p1 = b => b.Title.Contains("economy");
Predicate<Book> p2 = b=>b.PublicationYear>2001;
Predicate chain = p1.And(p2);
我不太明白解释。有人可以解释一下上面扩展方法的代码是如何工作的吗?谢谢