0

当我创建一个类并覆盖ToString()时,当我在调试器下运行 Visual Studio 时,我可以用鼠标光标将鼠标悬停在该类型的变量上,VS 会向我显示我在方法中返回的任何内容,让在那里放置典型的信息总和特定的类和在调试过程中有价值。但是,如果我从 继承我的类List,VS 总是显示类似于Count=20忽略从我的覆盖返回的值ToString(),所以我variable.ToString()每次想查看类摘要时都必须输入 QuickWatch 窗口。有没有办法让 VS 显示ToString()继承自的类List

4

1 回答 1

3

您需要创建自己的继承 .NETList类的子类,并在那里覆盖该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();
    }
}

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

于 2013-03-07T19:14:09.323 回答