C# 是否可以为第三方类更改Visual Studio调试器变量窗口值列中显示的内容?
调试时,有各种窗口(自动、局部、监视)包含列名称、值、类型。 该值通常似乎显示对象的类名。在特定情况下,我想根据类实例的属性来展示一些更有意义的东西 作为一个具体的例子,例如,我希望看到基于字符串或值的引用类型(如果有效)的文本表示,而不是看到“System.CodeDom.CodeTypeReferenceExpression” 可视化工具似乎提供了单独的对话框窗口,而不是填充值列的方法 数据提示是按变量而不是按类型提供的 最接近的事情似乎是,在这种情况下,我想我是在问“是否可以将属性应用于其他人的类?”C# 是否可以为第三方类更改Visual Studio调试器变量窗口值列中显示的内容?,c#,visual-studio,debugging,visual-studio-debugging,C#,Visual Studio,Debugging,Visual Studio Debugging,调试时,有各种窗口(自动、局部、监视)包含列名称、值、类型。 该值通常似乎显示对象的类名。在特定情况下,我想根据类实例的属性来展示一些更有意义的东西 作为一个具体的例子,例如,我希望看到基于字符串或值的引用类型(如果有效)的文本表示,而不是看到“System.CodeDom.CodeTypeReferenceExpression” 可视化工具似乎提供了单独的对话框窗口,而不是填充值列的方法 数据提示是按变量而不是按类型提供的 最接近的事情似乎是,在这种情况下,我想我是在问“是否可以将属性应用于其
我主要讨论的是Visual Studio 2010,尽管Visual Studio 2008的答案会很有用。您可以为自己的类重写ToString方法。该值通常只是对ToString的调用,如果未被重写,则显示类型
更新:对于您没有代码的类,我不能提供有价值的答案,而您可以包装这些类(继承自),但这是,嗯,奇怪的礼貌(IMHO)。您可以为自己的类重写ToString方法。该值通常只是对ToString的调用,如果未被重写,则显示类型
更新:对于您没有代码的类,我无法提供有价值的答案,而不是您可以包装这些类(继承自),但这就是,嗯,奇怪的礼貌(IMHO)。是的,有两种方法可以实现这一点:
[assembly:DebuggerDisplay(@“\{Color={Color}”,Target=typeof(Pen))]
这个答案适用于VS2008和VS2010。是的,有两种方法可以实现这一点:
[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()
以快速检查调试器中对象中的数据,但它有成为永久代码和