代码之家  ›  专栏  ›  技术社区  ›  herbrandson

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

  •  17
  • herbrandson  · 技术社区  · 15 年前

    我有一个具有以下签名的函数。。。

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

    我试图找到一种方法,将“expression”参数转换回类似于原始源代码的内容(或者至少是原始源代码的c#表示)。如果有人这样调用函数。。。

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

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

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

    有人这样做过吗?

    2 回复  |  直到 15 年前
        1
  •  13
  •   Steve Wilkes    4 年前

    我刚刚偶然发现了这一点;我编写了一个免费的开源库,它提供了一种扩展方法,可以从表达式中创建类似字符串的源代码:

    using AgileObjects.ReadableExpressions;
    
    var myExpression = CreateBigExpressionTree();
    var expressionSource = myExpression.ToReadableString();
    

    我已经写信了 a blog on GitHub ,有 a NuGet package 包含扩展方法,我已经为VS 2010编写了一组调试器可视化工具->2019年 the Visual Studio Marketplace .

        2
  •  9
  •   Robert Harvey    8 年前

    下面是一篇有趣的文章,其中包含代码,讨论了将表达式树转换回与原始源代码(大致)相似的内容:

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