Преобразование дерева выражений в строку исходного кода
У меня есть функция, которая имеет следующую подпись...
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)
Кто-нибудь это сделал?
Ответы
Ответ 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.