Как работает этот класс PredicateBuilder?
Я читал блестящую книгу Джозефа Албахари по 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, но что вообще делает этот код?
Заранее спасибо:)
1 ответ
Это использует деревья выражений, чтобы "построить" предикат из двух входных выражений, представляющих предикаты.
Деревья выражений - это способ использования лямбда-выражений для генерации представления кода в древовидной структуре (а не делегата напрямую). Это берет два дерева выражений, представляющих предикаты (Expression<Func<T,bool>>
) и объединяет их в новое дерево выражений, представляющее регистр "или" (и регистр "и" во втором методе).
Деревья выражений и соответствующие им утилиты, как указано выше, полезны для таких вещей, как ORM. Например, Entity Framework использует деревья выражений с IQueryable<T>
превратить "код", определенный как лямбда-выражение, в SQL, который запускается на сервере.