Convert an Expression Tree to Source Code string
I have a function that has the following signature...
public string DoJunk(Expression<Func<bool>> expression)
I'm trying to find a way to convert the "expression" parameter back to something resembling the original source code (or at least a c# representation of the original souce code). So, if someone calls the function like this...
DoJunk(() => (i + j) * 9 == Math.Round((double)j / (i - 3), 4))
...I'd like to be able to convert the expression to this...
(i + j) * 9 == Math.Round((double)j / (i - 3), 4)
Has anyone done this?
I've just happened across this; I've written a free, open-source library which provides an extension method to create a source-code-like string from an Expression:
using AgileObjects.ReadableExpressions;
var myExpression = CreateBigExpressionTree();
var expressionSource = myExpression.ToReadableString();
I've written a blog about it, the source is on GitHub, there's a NuGet package containing the extension method, and I've written a set of Debugger Visualizers for VS 2010 -> 2019 which are in the Visual Studio Marketplace.
Here's an interesting article, with code, discussing the conversion of expression trees back into something that resembles (roughly) the original source:
Expression Trees-Lambdas to CodeDom Conversion
As a side-note, have you tried calling the expression's ToString
method?
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))