我有这从继承的类List<MagicBean>
它运作良好,并预期在各方面,除了一个:当我加入[DebuggerDisplay]
属性。 即使看着列表中包含了其作为[DebuggerDisplay("Count = {Count}")]
,如果我这么多的复制并粘贴到我的,我失去了直接在所有MagicBeans的看我有没有钻进能力碱 - >在调试私有成员。
如何获得两全其美吗? IE:在值列自定义值,和Visual Studio不能向我隐瞒我的魔豆?
我有这从继承的类List<MagicBean>
它运作良好,并预期在各方面,除了一个:当我加入[DebuggerDisplay]
属性。 即使看着列表中包含了其作为[DebuggerDisplay("Count = {Count}")]
,如果我这么多的复制并粘贴到我的,我失去了直接在所有MagicBeans的看我有没有钻进能力碱 - >在调试私有成员。
如何获得两全其美吗? IE:在值列自定义值,和Visual Studio不能向我隐瞒我的魔豆?
你可以得到你所需要使用的效果DebuggerTypeProxy属性。 你需要创建一个类,使您的继承列表的调试“可视化”:
internal sealed class MagicBeanListDebugView
{
private List<MagicBean> list;
public MagicBeanListDebugView(List<MagicBean> list)
{
this.list = list;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public MagicBean[] Items{get {return list.ToArray();}}
}
然后,您可以声明该类被调试器显示类,与一起使用DebuggerDisplay
属性:
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(typeof(MagicBeanListDebugView))]
public class MagicBeanList : List<MagicBean>
{}
这会给你,当你将鼠标悬停在Visual Studio中的继承列表的一个实例“计数= 3”的消息,并在列表中的项目的看法,当你展开根节点,而不必深入到基本属性。
使用ToString()
来明确获得调试输出是不是一个好方法,当然,除非你已经重写ToString()
用在其他地方你的代码,在这种情况下,你可以利用它。
在看“后使用DebuggerDisplay属性 MSDN上的”文章,他们认为你可以重写你的类的ToString()函数作为替代选项,而不是使用DebuggerDisplay属性。 覆盖toString()方法,也不会隐藏自己的豆子。
如果C#对象具有重写的ToString(),调试器将调用超控,并显示其结果而不是标准的{}。 因此,如果你已经重写的ToString(),你不必使用DebuggerDisplay。 如果同时使用时,DebuggerDisplay属性优先于的ToString()重写。
您可以重写ToString()方法,在你的类或者是你用它作其他用途?
我不知道你是否已经考虑过这个与否,但我想我会建议它只是柜面它帮助。 :-)
为了完整所以任何人都可以快速地嘲笑起来; 这里有一个简单的例子,我提出:
namespace StackOverflow
{
//broken BeanPouch class that uses the DebuggerDisplay attribute
[System.Diagnostics.DebuggerDisplay("Count = {Count}")]
class BrokenBeanPouch : List<MagicBean>
{ }
//working BeanPouch class that overrides ToString
class WorkingBeanPouch : List<MagicBean>
{
public override string ToString()
{
return string.Format("Count = {0}", this.Count);
}
}
class Program
{
static WorkingBeanPouch myWorkingBeans = new WorkingBeanPouch()
{
new MagicBean() { Value = 4.99m }, new MagicBean() { Value = 5.99m }, new MagicBean() { Value = 3.99m }
};
static BrokenBeanPouch myBrokenBeans = new BrokenBeanPouch()
{
new MagicBean() { Value = 4.99m }, new MagicBean() { Value = 5.99m }, new MagicBean() { Value = 3.99m }
};
static void Main(string[] args)
{
//break here so we can watch the beans in the watch window
System.Diagnostics.Debugger.Break();
}
}
class MagicBean
{
public decimal Value { get; set; }
}
}
使用DebuggerDisplay属性,像这样:
[DebuggerDisplay("ID:{ID},Customers:{Customers==null?(int?)null:Customers.Count}")]`
class Project
{
int ID{get;set;}
IList<Customer> Customers{get;set;}
}
一些更多的信息在这里 。