我有一个具有以下签名的功能......
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)
有没有人这样做过?
答案 0 :(得分:9)
这是一篇有趣的文章,带有代码,讨论将表达式树转换回类似于(大致)原始来源的东西:
作为旁注,您是否尝试过调用表达式的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。