Как использовать 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: после объяснения я понял, что вы хотите. Можно сделать свой пользовательский многострочный визуализатор, но вы наверное, не нравится, как это делается:)
- вам нужно добавить ссылку на
Microsoft.VisualStudio.DebuggerVisualizers.dll
. Я нашел его в Add Reference - > Assemblies - > Extensions list - ваша потребность создать новый класс и наследовать DialogDebuggerVisualizer класса. Переопределить метод Show и отобразить необходимое содержимое.
- выбрать свой класс
Serializible
- добавить ссылку на пользовательский визуализатор
вот пример код:
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());
}
}
}
}
затем вы увидите лупу, и когда вы нажмете на нее, результат будет выглядеть так: