// 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);