在Visual Studio 2015(以及某些旧版本)中调试C#代码时,可以通过以下方式在各种可视化工具(文本,XML,HTML,JSON)中显示string
变量的值。带有放大镜图标的下拉列表。这也适用于某些非字符串类型,例如System.Xml.Linq.XElement
。是否可以使用这些内置的可视化工具来显示我自己的自定义类型变量的值?
上下文:
我需要能够快速检查复杂的自定义类型的状态,该类型只能在多行文本环境中可视化。
答案 0 :(得分:5)
如果我正确理解了您的问题,那么您可以使用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;
}
}
答案 1 :(得分:1)
是的,你可以。其中一个选项是使用DebuggerDisplayAttribute
调试器显示属性允许指定并最好地理解该类型的运行时行为的类型的开发人员还指定在调试器中显示该类型时的类型。
[DebuggerDisplay("The count value in my class is: {count}")]
class MyClass
{
public int count { get; set; }
}
编辑:解释后,我理解你想要的东西。您可以自定义多行可视化工具,但您可能不喜欢这样做:)
Microsoft.VisualStudio.DebuggerVisualizers.dll
的引用。我在添加参考中找到了它 - >装配 - >扩展程序列表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());
}
}
}
}