6

TL;DR
有谁知道如何用 C# 为 Visual Studio 2012 编写调试可视化工具,以便我可以可视化IEnumerable<string>string[]类似的对象?

更多信息
Visual Studio Debug Visualizer 很棒,我经常使用一些流行的 ( Mole )。但是,现在是推出一些自定义可视化工具的时候了。我从一个简单的字符串可视化器开始:

[assembly: System.Diagnostics.DebuggerVisualizer(typeof(My.Namespace.DebuggerSide),
                                            typeof(VisualizerObjectSource),
                                            Target = typeof(string),
                                            Description = "Awesome Visualizer")]

DebuggerSide 的代码基本上是模板中的示例:

public class DebuggerSide : DialogDebuggerVisualizer
{
    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        if (windowService == null)
            throw new ArgumentNullException("windowService");
        if (objectProvider == null)
            throw new ArgumentNullException("objectProvider");


        var data = (string)objectProvider.GetObject();

        using (var displayForm = new VisualizerForm(data))
        {
            windowService.ShowDialog(displayForm);
        }
    }

    /// <summary>
    /// Tests the visualizer by hosting it outside of the debugger.
    /// </summary>
    /// <param name="objectToVisualize">The object to display in the visualizer.</param>
    public static void TestShowVisualizer(object objectToVisualize)
    {
        VisualizerDevelopmentHost visualizerHost = new VisualizerDevelopmentHost(objectToVisualize, typeof(DebuggerSide));
        visualizerHost.ShowVisualizer();
    }
}

VisualizerForm是带有额外控件等的自定义表单...当我构建项目并将 dll 放入My Documents/Visual Studio 11/Visualizers文件夹中并重新启动 Visual Studio 时,当为字符串对象命中断点时,我确实可以看到调试器出现在镜子图标下. 呜呼!到目前为止,一切都很好。

现在我想,而不是可视化string,可视化string[]IEnumerable<string>类似的对象。但是,当我将程序集属性更改为 时IEnumerable<string>,这不起作用,IEnumerable 对象上什至没有显示玻璃图标。

更新
我可以通过将 TargetType 更改为List<>然后检查是否可以转换为List<string>. 但是,这意味着我必须将我想要调试的所有对象都转换为List并且不能使用IEnumerable<>或 string[]

4

2 回答 2

1

可视化工具记录为

对泛型类型的支持是有限的。仅当泛型类型是开放类型时,您才能为泛型类型的目标编写可视化工具。

这意味着您不能编写使用封闭构造类型(如IEnumerable<string>.

您是否尝试过将目标类型设置为IEnumerable<>然后检查元素是否属于 type string

于 2012-08-28T15:23:36.627 回答
1

请参阅此处的“可以具有调试器可视化器的对象”部分: https ://rapiddevbookcode.codeplex.com/wikipage?title=EnumerableDebugVisualizer

我的 Enumerable Debugger Visualizer 将与 IEnumerable 一起使用,如果使用它注册了底层具体类型,您可以查看注册代码以使您的工作正常。

于 2014-02-07T10:32:06.430 回答