.net - decision - Convertir un árbol de expresiones en una cadena de código fuente
como hacer un arbol binario c# (2)
Tengo una función que tiene la siguiente firma ...
public string DoJunk(Expression<Func<bool>> expression)
Estoy tratando de encontrar una manera de convertir el parámetro "expresión" a algo que se parezca al código fuente original (o al menos una representación ac # del código fuente original). Entonces, si alguien llama a la función así ...
DoJunk(() => (i + j) * 9 == Math.Round((double)j / (i - 3), 4))
... me gustaría poder convertir la expresión a esta ...
(i + j) * 9 == Math.Round((double)j / (i - 3), 4)
¿Alguien ha hecho esto?
Acabo de pasar por esto; He escrito una biblioteca gratuita de código abierto que proporciona un método de extensión para crear una cadena similar a un código fuente a partir de una expresión:
using AgileObjects.ReadableExpressions;
var myExpression = CreateBigExpressionTree();
var expressionSource = myExpression.ToReadableString();
Escribí un blog al respecto, la fuente está en GitHub , hay un paquete NuGet que contiene un método de extensión y escribí un conjunto de visualizadores de depuradores para VS 2010 -> 2019 que se encuentran en Visual Studio Marketplace .
Aquí hay un artículo interesante, con código, que discute la conversión de árboles de expresión en algo que se parece (aproximadamente) a la fuente original:
Como nota al margen, ¿has intentado llamar al método ToString
la expresión?
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))