我正在手动创建表达式树
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,这是我想从我的程序输出的内容。我知道这是使用表达式树可视化工具。有没有办法在我的代码中使用它? 谢谢!
答案 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)
虽然这些类是内部的,但源代码是公开的: - )
显然你必须解决一些事情,但要让它发挥作用并不困难。
答案 3 :(得分:1)
http://referencesource.microsoft.com/#System.Core/Microsoft/Scripting/Ast/ExpressionStringBuilder.cs给出了在调试时在Visual Studio中为表达式看到的鼠标悬停文本。
根据您的需要,安德鲁杰克逊提到的那个或者DebugViewWriter.cs应该涵盖的东西。