Подтвердить что ты не робот

Преобразование дерева выражений в строку исходного кода

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Деревья выражений-Lambdas для преобразования 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))

Ответ 2

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

using AgileObjects.ReadableExpressions;

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

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