Вы не можете этого сделать. Переменная типа Func<...>
представляет собой делегат , который в основном похож на указатель на область памяти, которая содержит скомпилированный код для лямбда-выражения. В .NET нет функциональности для преобразования уже скомпилированного кода обратно в дерево выражений.
В зависимости от того, что вы пытаетесь сделать, возможно, вы можете столкнуться с неполным решением: создать дерево выражений, которое вызывает делегатов. Поскольку я ничего не знаю о методе, которому вы хотите передать дерево выражений, я понятия не имею, является ли это возможным решением для вас.
Сводка: Если вам нужно полное дерево выражений для всех выражений, вам необходимо убедиться, что они являются деревьями выражений с самого начала. Как только вы скомпилируете его в делегат, дерево выражений будет потеряно.
Убедившись, что они являются деревьями выражений, вы можете объединить их, используя что-то вроде следующего:
Expression<Func<Customer, bool>> a = c => c.FullName == "John";
Expression<Func<Customer, bool>> b = c => c.LastName == "Smith";
var cp = Expression.Parameter(typeof(Customer), "c");
var ai = Expression.Invoke(a, cp);
var bi = Expression.Invoke(b, cp);
var final = Expression.Lambda<Func<Customer, bool>>(
Expression.AndAlso(ai, bi), cp);
Конечно, здесь используется оператор AndAlso
(&&
); Вы также можете использовать OrElse
для ||
и т. д.