繁体   English   中英

如何使用Visual Studio Text Visualizer进行自定义类型?

[英]How to use Visual Studio Text Visualizer for custom types?

在Visual Studio 2015(以及某些旧版本)中,在调试C#代码时,可以通过带有放大镜图标的下拉列表在各种可视化工具(文本,XML,HTML,JSON)中显示string变量的值。 这也适用于某些非字符串类型,例如System.Xml.Linq.XElement 是否可以使用这些内置可视化工具来显示我自己的自定义类型变量的值?

语境:

我需要能够快速检查复杂自定义类型的状态,该类型只能在多行文本环境中可接受地显示。

如果我正确理解您的问题,那么您可以使用DebuggerTypeProxy实现您的目标。 它会导致调试器在您检查复杂类型的对象时创建和显示代理对象。

在下面的示例中,代理对象包含一个(多行)字符串属性,您可以使用文本可视化工具查看该属性。 如果你仍然需要查看底层对象本身,那么这就是Raw view按钮的用途。

[DebuggerTypeProxy(typeof(ComplexTypeProxy))]
class ComplexType
{
    // complex state
}

class ComplexTypeProxy
{
    public string Display
    {
        get { return "Create a multi-line representation of _content's complex state here."; }
    }

    private ComplexType _content;

    public ComplexTypeProxy(ComplexType content)
    {
        _content = content;
    }
}

是的你可以。 其中一个选项是使用DebuggerDisplayAttribute

调试器显示属性允许指定并最好地理解该类型的运行时行为的类型的开发人员还指定在调试器中显示该类型时的类型。

[DebuggerDisplay("The count value in my class is: {count}")]
class MyClass
{
   public int count { get; set; }
}

编辑:解释后,我明白你想要什么。 可以自定义多行可视化工具,但你可能不喜欢这样做:)

  1. 您需要添加对Microsoft.VisualStudio.DebuggerVisualizers.dll的引用。 我在Add Reference - > Assemblies - > Extensions列表中找到了它
  2. 您需要创建新类并继承DialogDebuggerVisualizer类。 覆盖Show方法并显示所需内容。
  3. 将您的班级标记为Serializible
  4. 添加对自定义Visualizer的引用

以下是示例代码:

using System.Windows.Forms;
using Microsoft.VisualStudio.DebuggerVisualizers;
[assembly: DebuggerVisualizer(typeof(MyClassVisualizer), Target = typeof(MyClass), Description = "My Class Visualizer")]

namespace MyNamespace
{
    [Serializable]
    public class MyClass
    {
        public int count { get; set; } = 5;
    }

    public class MyClassVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            MyClass myClass = objectProvider.GetObject() as MyClass;

            if (objectProvider.IsObjectReplaceable && myClass != null)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("Here is");
                sb.AppendLine("your multi line");
                sb.AppendLine("visualizer");
                sb.AppendLine($"of MyClass with count = {myClass.count}");

                MessageBox.Show(sb.ToString());
            }
        }
    }
}

然后你会看到放大镜,当你点击它时,结果将如下所示: 在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM