【问题标题】:Is it possible to change what is displayed in a Visual Studio Debugger Variables window Value column for a 3rd party class?是否可以更改第 3 方类的 Visual Studio 调试器变量窗口值列中显示的内容?
【发布时间】:2011-10-05 10:51:41
【问题描述】:

调试时有各种Variable 窗口(自动、本地、监视)包含名称、值、类型列。 该值通常似乎显示了对象的类名。在特定情况下,我想根据类实例的属性展示一些更有意义的东西。

作为一个具体的例子,对于CodeTypeReference,我希望看到基于BaseType 字符串或ArrayElementType 值的引用类型的文本表示(如果有效),而不是看到“System.CodeDom. CodeTypeReferenceExpression”。

可视化工具似乎提供了单独的对话窗口,而不是一种填充值列的方法。

数据提示是按变量而不是按类型的。

最接近的似乎是DebuggerTypeProxyAttribute,在这种情况下,我想我是在问“是否可以将属性应用于其他人的类?”

我主要处理 Visual Studio 2010,尽管 Visual Studio 2008 的答案会很有用。

【问题讨论】:

    标签: c# visual-studio debugging visual-studio-debugging


    【解决方案1】:

    是的,有两种方法可以做到这一点:

    1. 通过使用我创建的商业工具OzCode(以前是 Visual Studio 的 BugAid),您可以简单地为您的类型添加 star 属性/字段,并将它们显示在 任何类型,无论是否是第 3 方。

    2. 您可以更改您的 autoexp.cs 文件,并将 DebuggerDisplayAttribute 或 DebuggerTypeProxyAttribute 应用于第 3 方类型,如 my answer on a similar question 中所述。例如,这就是将 DebuggerDisplayAttribute 应用于 System.Drawing.Pen 的方式:[assembly: DebuggerDisplay(@"\{Color = {color}}", Target = typeof(Pen))]

    此答案适用于 VS2008 和 VS2010。

    【讨论】:

    • 谢谢 - 不知何故我错过了 autoexp.cs 得到这个工作,但前提是我使用 DebbugerDisplay 参数 Target=typeof(MyAssembly::Foo)。无法让 TargetTypeName="MyAssembly.Foo" 工作,包括添加大括号装饰。
    • 快进几年,发现TargetTypeName 适用于实例的GetType().AssemblyQualifiedName,这通常是autoexp.cs 中的一个条目,例如:[assembly: DebuggerDisplay(@"ProofInPudding {_privateStringData}", TargetTypeName = "MyNamespace.MySubNamespace.MyClassName, MyAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")],它将显示ProofInPooding "foo" 用于该类型的实例,其 _privateStringData 字段(或属性)设置为 "foo"
    • 甚至删除版本/文化/公钥令牌并使用[assembly: DebuggerDisplay(@"ProofInPudding {_privateStringData}", TargetTypeName = "MyNamespace.MySubNamespace.MyClassName, MyAssemblyName")]
    【解决方案2】:

    您可以为自己的类覆盖 ToString 方法。 Value 通常只是对 ToString 的调用,如果没有被覆盖,它会显示类型。

    更新:对于您没有代码的类,我无法提供有价值的答案,而不是您可以包装类(继承自),但那是,嗯,奇怪的是礼貌(恕我直言)。

    【讨论】:

    • 我不建议这样做 - 我曾经重写 ToString() 以在调试器中快速检查对象中的数据,但它有成为永久代码的趋势,然后它开始引入各种问题. ToString() 旨在提供对象的字符串表示,而开发人员通常希望在调试器中查看各种内部细节。
    【解决方案3】:

    是的,您可以将 DebuggerTypeProxyAttribute 应用于您不拥有的类型(除非它们是私有的),正如我对类似问题 here 的回答中所解释的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-18
      • 2018-12-28
      • 2021-06-03
      • 2010-10-24
      • 2023-03-11
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多