从代码中访问Expression.DebugView

时间:2011-05-14 03:42:58

标签: c# expression-trees

我正在手动创建表达式树

var innerAddition = Expression.Add(Expression.Constant(5), Expression.Constant(9));
var mult = Expression.Multiply(innerAddition, Expression.Constant(2));
var top = Expression.Add(Expression.Constant(3), mult);

当我在调试模式下查看DebugView时,我看到3 +(5 + 9)* 2,这是我想从我的程序输出的内容。我知道这是使用表达式树可视化工具。有没有办法在我的代码中使用它? 谢谢!

4 个答案:

答案 0 :(得分:6)

这是一个使用反射获取内部属性值的简单扩展方法。

public static string GetDebugView(this Expression exp)
{
    if (exp == null)
        return null;

    var propertyInfo = typeof(Expression).GetProperty("DebugView", BindingFlags.Instance | BindingFlags.NonPublic);
    return propertyInfo.GetValue(exp) as string;
}

答案 1 :(得分:5)

实现调试视图功能的类是故意internal,因此您无法在没有反射的情况下访问它们。虽然这似乎不公平,但调试的目的是调试,它不是一个受支持的API,因此可能随时改变,也许是为了改进调试!使用支持的公共API将确保与未来版本的兼容性。

以下是使用公共API的另一个StackOverflow问题:

答案 2 :(得分:1)

虽然这些类是内部的,但源代码是公开的: - )

http://referencesource.microsoft.com/#System.Core/Microsoft/Scripting/Ast/DebugViewWriter.cs,05c213f459ccd9cb

显然你必须解决一些事情,但要让它发挥作用并不困难。

答案 3 :(得分:1)

http://referencesource.microsoft.com/#System.Core/Microsoft/Scripting/Ast/ExpressionStringBuilder.cs给出了在调试时在Visual Studio中为表达式看到的鼠标悬停文本。

根据您的需要,安德鲁杰克逊提到的那个或者DebugViewWriter.cs应该涵盖的东西。