我有一个具有以下签名的功能......
public string DoJunk(Expression<Func<bool>> expression)
Run Code Online (Sandbox Code Playgroud)
我试图找到一种方法将"表达式"参数转换回类似于原始源代码的东西(或者至少是原始源代码的ac#表示).所以,如果有人像这样调用这个函数......
DoJunk(() => (i + j) * 9 == Math.Round((double)j / (i - 3), 4))
Run Code Online (Sandbox Code Playgroud)
...我希望能够将表达式转换为此...
(i + j) * 9 == Math.Round((double)j / (i - 3), 4)
Run Code Online (Sandbox Code Playgroud)
有没有人这样做过?
这是一篇有趣的文章,带有代码,讨论将表达式树转换回类似于(大致)原始源的东西:
作为旁注,您是否尝试过调用表达式的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))
Run Code Online (Sandbox Code Playgroud)
我刚发生过这件事; 我编写了一个免费的开源库,它提供了一种扩展方法,用于从Expression创建类似源代码的字符串:
using AgileObjects.ReadableExpressions;
var myExpression = CreateBigExpressionTree();
var expressionSource = myExpression.ToReadableString();
Run Code Online (Sandbox Code Playgroud)
我写过一篇关于它的博客,源代码在GitHub上,有一个包含扩展方法的NuGet包,我为VS 2010编写了一套Debugger Visualizers - > 2019,它们在Visual Studio Marketplace中.
| 归档时间: |
|
| 查看次数: |
5925 次 |
| 最近记录: |