Как использовать Visual Studio Text Visualizer для пользовательских типов?

в Visual Studio 2015 (и в некоторых более старых версиях) при отладке кода C# можно отобразить значения string переменные в различных визуализаторах (текст, XML, HTML, JSON) через раскрывающийся список со значком увеличительного стекла. Это также работает для некоторых нестроковых типов, например,System.Xml.Linq.XElement. Можно ли использовать эти встроенные визуализаторы для отображения значения переменной моего собственного пользовательского типа?

контекст:

мне нужно иметь возможность быстро проверить состояние сложного пользовательского типа, которое может быть приемлемо визуализировано только в мульти-строку текст среды.

2 ответов


Если я правильно понимаю ваш вопрос, то вы можете достичь того, что вам нужно с помощью атрибут debuggertypeproxy. Это заставляет отладчик создавать и отображать прокси-объект всякий раз, когда вы проверяете объекты вашего сложного типа.

в приведенном ниже примере объект proxy содержит строковое свойство (многострочное), которое можно просмотреть с помощью текстового визуализатора. Если вам все еще нужно посмотреть на сам объект, то, что это для.

[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; }
}

EDIT: после объяснения я понял, что вы хотите. Можно сделать свой пользовательский многострочный визуализатор, но вы наверное, не нравится, как это делается:)

  1. вам нужно добавить ссылку на Microsoft.VisualStudio.DebuggerVisualizers.dll. Я нашел его в Add Reference - > Assemblies - > Extensions list
  2. ваша потребность создать новый класс и наследовать DialogDebuggerVisualizer класса. Переопределить метод Show и отобразить необходимое содержимое.
  3. выбрать свой класс Serializible
  4. добавить ссылку на пользовательский визуализатор

вот пример код:

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());
            }
        }
    }
}

затем вы увидите лупу, и когда вы нажмете на нее, результат будет выглядеть так: enter image description here