Visual Studio Visualizer for IEnumerable <string> </string>

时间:2012-08-28 13:47:34

标签: c# visual-studio-2012 debuggervisualizer

TL; DR
有谁知道如何在C#中为Visual Studio 2012编写Debug Visualizer,这样我可以可视化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<>或字符串[]

2 个答案:

答案 0 :(得分:1)

展示台记录为

  

对通用类型的支持是有限的。只有当泛型类型是开放类型时,才可以为目标类型的目标编写可视化工具。

这意味着您无法编写使用闭合构造类型(如IEnumerable<string>)的可视化工具。您是否尝试将目标类型设置为IEnumeraable<>,然后检查元素是否为string类型?

答案 1 :(得分:1)

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

我的Enumerable Debugger Visualizer将使用IEnumerable,如果注册了它的基础具体类型,你可以查看注册码以使你的工作。