Везде, где вы используете термин «лямбда-выражение», вы на самом деле имеете в виду «дерево выражений».
Лямбда-выражение - это бит в исходном коде, который
parameters => code
, например
x => x * 2
Деревья выражений являются экземплярами класса System.Linq.Expressions.Expression (или, скорее, одного из производных классов), которые представляют код как данные.
Лямбда-выражения преобразуются компилятором в либо деревья выражений (или, скорее, код, который генерирует дерево выражений во время выполнения) или экземпляры делегатов.
Вы можете скомпилировать экземпляр LambdaExpression (который является одним из подклассов Expression) в делегат, но вы не можете перейти наоборот.
Теоретически может быть возможным написать такой "декомпилятор" на основе IL, возвращенного MethodBase.GetMethodBody в некоторых ситуациях, но в настоящее время существует различные делегаты, которые не могут быть представлены деревьями выражений. Дерево выражений представляет выражение , а не оператор или блок операторов - так что нет никаких циклов, ветвлений (кроме условных), присваивания и т. Д. Я считаю, что это может измениться в .NET 4.0, хотя я не ожидаю от Microsoft декомпиляции, если для этого нет веских причин.