当我创建一个类并覆盖ToString()
时,当我在Debugger下运行Visual Studio时,我可以用鼠标光标悬停在该类型的变量上,VS显示我在方法中返回的任何内容,让我们把这个特定类的典型信息加在一起,并在调试过程中有价值。但是,如果我从List
继承我的班级,VS总会显示类似Count=20
的内容,忽略从被覆盖的ToString()
返回的值,因此我必须每次在QuickWatch窗口中键入variable.ToString()
我想看看班级总结。有没有办法让VS为ToString()
继承的类显示List
?
答案 0 :(得分:3)
您需要创建自己的继承.NET List
类的子类,并在那里覆盖ToString()
方法。您需要更改使用标准List<type>
语法的任何位置以使用新的自定义List类。
public class MyList<T> : List<T>
{
public override string ToString()
{
StringBuilder sb = new StringBuilder();
foreach (T t in this)
{
sb.Append("[" + t.ToString() + "] ");
}
return sb.ToString();
}
}
使用此代码:
static void Main(string[] args)
{
MyList<string> strings = new MyList<string>();
strings.Add("asdf");
strings.Add("teare");
}
在调用ToString()时生成此输出:
[asdf] [teare]
编辑您的问题:
我建议构建一个通用接口,您可以指定一个特定的模板来匹配列表类的任何版本,然后可以获取特定的自定义类成员。下面的代码演示了。
public interface IWidget
{
string Name { get; }
}
public class Widget : IWidget
{
public string Name { get; private set; }
public Widget(string name_) { Name = name_; }
}
[DebuggerDisplay("{this.ToString()}")]
public class MyList<T> : List<T> where T : IWidget
{
public override string ToString()
{
StringBuilder sb = new StringBuilder();
foreach (IWidget w in this)
{
sb.Append("[" + w.Name + "] ");
}
return sb.ToString();
}
}
注意:这将限制您可以在自定义集合类中使用的类型,但这可能无关紧要取决于您要实现的目标。