C# 是否可以为第三方类更改Visual Studio调试器变量窗口值列中显示的内容?

C# 是否可以为第三方类更改Visual Studio调试器变量窗口值列中显示的内容?,c#,visual-studio,debugging,visual-studio-debugging,C#,Visual Studio,Debugging,Visual Studio Debugging,调试时,有各种窗口(自动、局部、监视)包含列名称、值、类型。 该值通常似乎显示对象的类名。在特定情况下,我想根据类实例的属性来展示一些更有意义的东西 作为一个具体的例子,例如,我希望看到基于字符串或值的引用类型(如果有效)的文本表示,而不是看到“System.CodeDom.CodeTypeReferenceExpression” 可视化工具似乎提供了单独的对话框窗口,而不是填充值列的方法 数据提示是按变量而不是按类型提供的 最接近的事情似乎是,在这种情况下,我想我是在问“是否可以将属性应用于其

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

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

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

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

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


我主要讨论的是Visual Studio 2010,尽管Visual Studio 2008的答案会很有用。

您可以为自己的类重写ToString方法。该值通常只是对ToString的调用,如果未被重写,则显示类型


更新:对于您没有代码的类,我不能提供有价值的答案,而您可以包装这些类(继承自),但这是,嗯,奇怪的礼貌(IMHO)。

您可以为自己的类重写ToString方法。该值通常只是对ToString的调用,如果未被重写,则显示类型


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

是的,有两种方法可以实现这一点:

  • 通过使用我创建的一个商业工具(以前的BugAid for Visual Studio),您可以简单地在您的类型上创建属性/字段,并将它们显示在任何类型的值列中,无论该类型是否为第三方

  • 您可以更改autoexp.cs文件,并将或DebuggerTypeProxyAttribute应用于第三方类型,如中所述。例如,这就是如何将DebuggerDisplay属性应用于System.Drawing.Pen:
    [assembly:DebuggerDisplay(@“\{Color={Color}”,Target=typeof(Pen))]


  • 这个答案适用于VS2008和VS2010。

    是的,有两种方法可以实现这一点:

  • 通过使用我创建的一个商业工具(以前的BugAid for Visual Studio),您可以简单地在您的类型上创建属性/字段,并将它们显示在任何类型的值列中,无论该类型是否为第三方

  • 您可以更改autoexp.cs文件,并将或DebuggerTypeProxyAttribute应用于第三方类型,如中所述。例如,这就是如何将DebuggerDisplay属性应用于System.Drawing.Pen:
    [assembly:DebuggerDisplay(@“\{Color={Color}”,Target=typeof(Pen))]


  • 这个答案适用于VS2008和VS2010。

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

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

    谢谢-不知何故,我错过了autoexp.cs,但只有在我使用DebbugerDisplay参数Target=typeof(MyAssembly::Foo)时,它才能正常工作。无法使TargetTypeName=“MyAssembly.Foo”工作,包括添加大括号装饰。快进几年后,发现
    TargetTypeName
    适用于实例的
    GetType().AssemblyQualifiedName
    ,它通常是autoexp.cs中的一个条目,类似于:
    [assembly:DebuggerDisplay(@“校对”){u privateStringData}”,TargetTypeName=“MyNamespace.MySubNamespace.MyClassName,MyAssemblyName,Version=1.0.0,Culture=neutral,PublicKeyToken=null”)
    将显示该类型实例的
    证明“foo”
    。\u privateStringData字段(或属性)设置为
    “foo”
    。或者甚至删除版本/区域性/公钥令牌并使用
    [汇编:DebuggerDisplay(@“ProofInPudding{u privateStringData}”,TargetTypeName=“MyNamespace.MySubNamespace.MyClassName,MyAssemblyName”)]
    谢谢-不知何故,我错过了autoexp.cs,但只有在我使用DebbugerDisplay参数Target=typeof时,它才能工作(MyAssembly::Foo)。无法使TargetTypeName=“MyAssembly.Foo”工作,包括添加支架装饰。快进几年后,发现
    TargetTypeName
    适用于实例的
    GetType().AssemblyQualifiedName
    ,它通常是autoexp.cs中的一个条目,类似于:
    [assembly:DebuggerDisplay](@“ProofInPudding{u privateStringData}”,TargetTypeName=“MyNamespace.MySubNamespace.MyClassName,MyAssemblyName,Version=1.0.0,Culture=neutral,PublicKeyToken=null”)
    将显示该类型实例的
    ProofInPooding“foo”
    。\u privateStringData字段(或属性)设置为
    “foo”“
    。甚至删除版本/区域性/公钥标记并使用
    [汇编:DebuggerDisplay(@“ProofInPudding{u privateStringData}”,TargetTypeName=“MyNamespace.MySubNamespace.MyClassName,MyAssemblyName”)]
    我不建议这样做-我曾经重写
    ToString()
    在调试器中快速检查对象中的数据,但它有成为永久代码的趋势,然后开始引入各种问题。
    ToString()
    旨在提供对象的字符串表示,而开发人员通常希望在调试器中查看所有类型的内部细节。我不建议这样做-我曾经重写
    ToString()
    以快速检查调试器中对象中的数据,但它有成为永久代码和