Преобразование лямбда-выражения в дерево выражений - PullRequest
38 голосов
/ 21 августа 2009

Я сделаю это очень просто,

Как мне вывести дерево выражений из лямбды ??

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

Ответы [ 3 ]

56 голосов
/ 21 августа 2009

Вы должны присвоить лямбду другому типу:

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

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

10 голосов
/ 21 августа 2009

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

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

7 голосов
/ 18 января 2011

Просто чтобы расширить ответ Конрада и исправить Пьера, вы все равно можете сгенерировать выражение из лямбда-компилятора, скомпилированного с помощью IL, хотя это не очень красиво. Дополнение примера Конрада:

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

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