.NET - оператор дампа лямбда-тела в строку - PullRequest
7 голосов
/ 07 февраля 2011

С учетом следующего примера лямбда-выражения:

var fMyAction = new Action(() =>
 {
    x += 2;
    something = what + ever; 
 });

Каковы возможные способы получить тело этой лямбды и записать его в строку? (То, что в конечном итоге позволит написать метод расширения для Action класса такого типа: fMyAction.Dump(), который вернет "x += 2; something = what + ever;").

Спасибо

Ответы [ 3 ]

11 голосов
/ 07 февраля 2011

Это невозможно в такой форме. Ваша лямда скомпилирована в байт-код. Хотя теоретически можно декомпилировать байт-код, как это делает рефлектор, он сложен, подвержен ошибкам и не дает точного кода, который вы скомпилировали, а просто эквивалентный код.

Если вы используете Expression<Action> вместо Action, вы получите дерево выражений, описывающее лямду. И преобразование дерева выражений в строку возможно (и существуют библиотеки, которые это делают).

Но в вашем примере это невозможно, потому что это многозначное выражение, лямда. И только простые лямды могут быть автоматически преобразованы в дерево выражений.

0 голосов
/ 07 февраля 2011
0 голосов
/ 07 февраля 2011

Прочитайте учебник здесь,

http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx

Обратите особое внимание на шаблон посетителя, который он использует для обхода заданного дерева выражений. Вы должны быть в состоянии изменить его в соответствии с вашими потребностями достаточно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...