将表达式树转换为源代码字符串

时间:2009-09-10 00:31:23

标签: .net lambda

我有一个具有以下签名的功能......

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

我正在尝试找到一种方法将“表达式”参数转换回类似于原始源代码的东西(或者至少是原始源代码的c#表示)。所以,如果有人像这样调用这个函数......

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

...我希望能够将表达式转换为此...

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

有没有人这样做过?

2 个答案:

答案 0 :(得分:9)

这是一篇有趣的文章,带有代码,讨论将表达式树转换回类似于(大致)原始来源的东西:

  

Expression Trees-Lambdas to CodeDom Conversion

作为旁注,您是否尝试过调用表达式的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))

答案 1 :(得分:8)

我刚发生过这件事;我编写了一个免费的开源库,它提供了一种扩展方法,用于从Expression创建类似源代码的字符串:

using AgileObjects.ReadableExpressions;

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

我写了a blog关于它,来源是on GitHub,其中a NuGet package包含扩展方法,我为VS 2010编写了一组调试器可视化工具 - &gt ; 2019年在the Visual Studio Marketplace