hacer expresiones decision como codigo binario arboles arbol .net lambda

.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:

Conversión de árboles de expresión-Lambdas a CodeDom

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))