如何使VS在调试器下从List继承的类显示ToString()值?

时间:2013-03-07 19:10:27

标签: visual-studio visual-studio-debugging

当我创建一个类并覆盖ToString()时,当我在Debugger下运行Visual Studio时,我可以用鼠标光标悬停在该类型的变量上,VS显示我在方法中返回的任何内容,让我们把这个特定类的典型信息加在一起,并在调试过程中有价值。但是,如果我从List继承我的班级,VS总会显示类似Count=20的内容,忽略从被覆盖的ToString()返回的值,因此我必须每次在QuickWatch窗口中键入variable.ToString()我想看看班级总结。有没有办法让VS为ToString()继承的类显示List

1 个答案:

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

注意:这将限制您可以在自定义集合类中使用的类型,但这可能无关紧要取决于您要实现的目标。