在调试器中格式化第三方.NET对象

时间:2012-03-01 20:07:17

标签: .net visual-studio visual-studio-2008 debugging formatting

我正在使用构建NameObjectCollectionBase派生的名称 - 对象对映射的第三方库。该集合有时很大(数千个项目),我想使用VS 2008调试器来检查其中的项目。 (我不是在寻找地图中的特定项目,我正在尝试查看项目列表是否与我期望的一样。)地图包含NameObjectEntry个实例。当我在调试器中检查这个地图时,这就是我所看到的:

[0] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}
[1] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}
...
[191] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}
[192] {System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry}

我想知道是否有办法告诉调试器如何格式化NameObjectEntry以向我显示实例内的数据,而不是类型名称。类似的东西:

[0] {"key1","value1"}
[1] {"key2","value2"}
...
[191] {"key191","value191"}
[192] {"key192","value192"}

使用我自己的类,我可以覆盖ToString()或使用DebuggerDisplay属性,但NameObjectEntry是.NET框架的一部分,我无法更改它。不幸的是,搜索结果大多推荐这两个中的一个。

有什么办法可以强制调试器以特定的方式显示这个对象吗?

编辑:对于未来的读者,解决方案是使用VS附带的autoexp.cs文件,如下所述:

http://msdn.microsoft.com/en-us/library/x810d419%28VS.90%29.aspx

1 个答案:

答案 0 :(得分:2)

是的,您可以使用DebuggerDisplay属性。当您可以访问该类的源代码时,这很容易。请查看此链接以获取更多信息:http://msdn.microsoft.com/en-us/library/ms228992.aspx

如果您无法访问源代码,可以尝试执行以下操作:

  • 确保您可以创建从要在调试器中格式化的类派生的分类
  • 在您自己的代码中创建派生类(它可以只是一个空类)
  • DebuggerDisplay属性应用于派生类,并在应用程序中使用此类(而不是外部类)

所以,我们假设您有一个名为SampleExternalClass

的外部类

在您自己的代码中,您应该创建一个派生类:

[DebuggerDisplay("custom formatted object with string = { StringPropertyNameFromBaseClass } ")]
class SampleInternalClass : SampleExternalClass
{
    //you don't have to put anything in here
}

在这些步骤之后,当您在调试器中使用SampleInternalClass类型的视图对象时,它应该按照属性中的指定进行格式化。

当两个类都在同一个dll中时,这似乎有效,但我认为它应该适用于单独的dll。