调试器可视化器生成对象初始化器代码

Posted

技术标签:

【中文标题】调试器可视化器生成对象初始化器代码【英文标题】:Debugger Visualizer to generate Object Initializer code 【发布时间】:2011-05-11 16:18:46 【问题描述】:

我们有一个错误要修复,并且像任何优秀的 TDD 实践者一样,我想先编写一个失败的测试来表示该错误。该错误存在于一种将相当复杂的类型作为输入的方法中。只有当复杂类型设置了特定的属性值组合时,该错误才会重现。

到目前为止,我已经重现了该错误,并且在调试器中可以查看复杂类型的运行时值。现在我需要在单元测试的“排列”部分中创建该复杂类型,以便将其提供给单元测试的“行为”部分中的错误方法。

我可以手动编写一个大的对象初始化程序代码块,例如:

var cats =
    new List<Cat>
        
            new Cat Name = "Sylvester", Age = 8,
            new Cat Name = "Whiskers", Age = 2
        ;

甚至是这样的:

var cats = new List<Cat>();
var cat1 = new Cat();
cat1.Name = "Sylvester";
cat1.Age = 8;
cats.Add(cat1);
var cat2 = new Cat();
cat2.Name = "Whiskers";
cat2.Age = 2;
cats.Add(cat2);

那里没什么好看的。唯一的问题是“手动”部分——在我的例子中,复杂类型并不像上面的例子那么简单。

我还可以在调试器中使用任何内置调试器可视化工具查看对象。所以我想我会编写一个自定义的调试器可视化器,它会为我生成对象初始化代码。要使用它,我会在调试器中重现问题,打开 QuickWatch 窗口并选择我的自定义可视化工具。

另一种选择是编写自定义序列化实现,该实现将“序列化”为对象初始化代码块。使用它比打开 QuickWatch 窗口要困难一些,但它可以工作。

在我自己解决这个问题之前,有没有人做过这样的事情?介意分享一个代码sn-p吗?或者有人会建议另一种方法吗?

附:在我的例子中,对象的类型是抽象基类的子类。只是想提一下。

【问题讨论】:

我知道这个问题是在回来的时候被问到的,但我只是因为可以而回复。我已经实现它只是为了我的个人使用。详情mrvshah.wordpress.com/2011/10/06/…源代码github.com/mrvshah/CreateCodeDebugVisualizer 【参考方案1】:

这是一个名为 Object Exporter 的工具,它完全符合您的要求,它会从调试窗口中的任何对象生成 C# 初始化代码:

https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

包含更多信息的博文:

http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/

【讨论】:

现在使用它并爱上它!完美运行。谢谢!【参考方案2】:

这些建议不会奏效。 阅读第一行

您可以为 任何托管类的对象,除了 对象或数组。

http://msdn.microsoft.com/en-us/library/e2zc529c.aspx

这就是你的答案。如果我阅读正确,则无法通过可视化器实现。有点蹩脚。

【讨论】:

你是绝对正确的。我只是在尝试实施我的之后才发现。最后,我在调试时使用即时窗口调用我编写的静态方法来生成对象初始化程序代码(将我想要初始化程序代码的对象实例作为参数传递)。它有效,但不是一个整齐打包、可重复使用的调试器可视化器解决方案。 :-(【参考方案3】:

我不知道有任何现有特性/功能可以提供您正在寻找的行为。但是,编写 Visualizer 来为给定对象生成代码的想法对于简单对象类型来说似乎是合理的:那些由原始类型的属性组成的对象。一旦你超越了这一点,任务就会变得越来越困难。

在可视化工具中,您可以访问相关对象,并且可以使用反射等技巧来获取成员。对于原始类型,将成员的值表示为代码很容易:intstring 等....对于非原始类型来说,这要困难得多,因为过程变得递归并且您需要考虑对象循环。

如果这对你有用,这里有一个关于调试器可视化器的快速教程

http://blogs.msdn.com/b/lior/archive/2009/05/31/creating-a-debugger-visualizer-for-visual-studio-c-tutorial.aspx

总而言之,手写每个场景可能会更容易:(

【讨论】:

以上是关于调试器可视化器生成对象初始化器代码的主要内容,如果未能解决你的问题,请参考以下文章

C#_基础,初始化器

对象初始化器与集合初初始化器

Python之迭代器,生成器

类加载器

Python:迭代器与生成器

Python3之迭代器,生成器