Преобразование дерева Lambda в выражение

Я буду держать его очень простым,

Как получить дерево выражений из lambda??

или из выражения запроса?

Ответ 1

Вы должны назначить лямбду другому типу:

// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;

То же самое касается аргументов метода. Однако, как только вы присвоите такое lambda-выражение типу Func<>, вы не сможете вернуть дерево выражений.

Ответ 2

Конрадский ответ точен. Вам нужно присвоить лямбда-выражение Expression<Func<...>>, чтобы компилятор сгенерировал дерево выражений. Если вы получаете лямбда как Func<...>, Action<...> или другой тип делегата, все, что у вас есть, это куча инструкций IL.

Если вам действительно нужно иметь возможность преобразовать скомпилированную lambda с IL-меткой в ​​дерево выражений, вам придется декомпилировать ее (например, делать то, что делает инструмент Lutz Roeder Reflector). Я бы посоветовал взглянуть на библиотеку Cecil, которая обеспечивает расширенную поддержку IL-манипуляции и может сэкономить вам довольно много времени.

Ответ 3

Просто чтобы расширить ответ на Konrad, и, чтобы исправить Pierre, вы все равно можете генерировать Expression из скомпилированной lambda, хотя это и не очень элегантно. Пример дополнения Konrad:

// Gives you a lambda:
Func<int, int> f = x => x * 2;

// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);