【问题标题】:How to reconstruct linq expression tree如何重建linq表达式树
【发布时间】:2019-04-11 07:37:35
【问题描述】:

如何检查 linq 表达式树,以便可以逐个语句地重建它(使用 System.Linq.Expressions.Expression 方法)?我正在使用 VS17 中的 DebugView 来可视化表达式,但阅读起来不是很友好。也许有更好的选择?

【问题讨论】:

  • 你可以使用 linqpad。
  • VS 环境中的选项呢?我想在当前代码上应用这个可视化器,转移到 linqpad 似乎相当复杂
  • 如果它足够复杂以至于 DebugView 难以阅读,我怀疑任何其他方法都会产生更复杂的东西!当您习惯它时,DebugView 非常清晰。我建议阅读docs.microsoft.com/en-us/dotnet/api/…,将您认为需要的不同类型的东西放在一起,并习惯它们在 DebugView 中的显示方式。
  • @canton7 如果它足够复杂以至于 DebugView 难以阅读,我怀疑任何其他方法都会产生更复杂的东西! I beg to differ.
  • @ZevSpitz 我认为关于别人问题的评论部分是讨论这个问题的错误地方。我不想要一个我可以折叠的不可读的树 - 我希望能够以一种我可以直观地理解整体结构的方式读取表达式树,而 DebugView 就是这样做的。如果您不同意,我建议在该页面上放置并排示例 - 例如foreach 循环,或其他包含多个块、跳转等的东西,占用多行。

标签: c# linq lambda expression expression-trees


【解决方案1】:

(免责声明:我是相关库的作者。)

使用NuGet 上提供的ExpressionTreeToString 库,您可以在表达式上调用ToString 扩展方法:

// using ExpressionToString
Expression<Func<string, int, string>> expr = (s, i) => $"{s}, {i}";    
Console.WriteLine(expr.ToString("Factory methods"));

然后得到如下输出:

// using static System.Linq.Expressions.Expression

Lambda(
    Call(
        typeof(string).GetMethod("Format"),
        Constant("{0}, {1}"), s,
        Convert(i,
            typeof(object)
        )
    ),
    var s = Parameter(
        typeof(string),
        "s"
    ),
    var i = Parameter(
        typeof(int),
        "i"
    )
)

有关DebugView 属性使用的语法的详细信息,请参阅DebugView syntax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多