Преобразовать дерево выражений в строку исходного кода - PullRequest
17 голосов
/ 10 сентября 2009

У меня есть функция, которая имеет следующую подпись ...

public string DoJunk(Expression<Func<bool>> expression)

Я пытаюсь найти способ преобразовать параметр «expression» обратно во что-то, напоминающее исходный исходный код (или, по крайней мере, представление c # оригинального исходного кода). Итак, если кто-то вызывает такую ​​функцию ...

DoJunk(() => (i + j) * 9 == Math.Round((double)j / (i - 3), 4))

... Я хотел бы иметь возможность преобразовать выражение в это ...

(i + j) * 9 == Math.Round((double)j / (i - 3), 4)

Кто-нибудь делал это?

Ответы [ 2 ]

9 голосов
/ 10 сентября 2009

Вот интересная статья с кодом, в которой обсуждается преобразование деревьев выражений обратно во что-то, что напоминает (примерно) исходный источник:

Преобразование деревьев-лямбда-выражений в CodeDom

Как примечание: вы пытались вызвать метод выражения ToString?

Expression<Func<int, int, bool>> expr =
    (i, j) => (i + j) * 9 == Math.Round((double)j / (i - 3), 4);

Console.WriteLine(expr.ToString());
// (i, j) => (Convert(((i + j) * 9)) = Round((Convert(j) / Convert((i - 3))), 4))

Console.WriteLine(expr.Body.ToString());
// (Convert(((i + j) * 9)) = Round((Convert(j) / Convert((i - 3))), 4))
8 голосов
/ 05 апреля 2016

Я только что столкнулся с этим; Я написал бесплатную библиотеку с открытым исходным кодом, которая предоставляет метод расширения для создания строки, подобной исходному коду, из выражения:

using AgileObjects.ReadableExpressions;

var myExpression = CreateBigExpressionTree();
var expressionSource = myExpression.ToReadableString();

Я написал в блоге об этом, источник на GitHub , пакет NuGet , содержащий метод расширения, и я написал набор визуализаторов отладчика для VS 2010 -> 2019, которые находятся в Visual Studio Marketplace .

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