Как работает этот класс 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, который запускается на сервере.

Другие вопросы по тегам