【问题标题】:How to make VS show ToString() value for classes inherited from List under debugger?如何让 VS 在调试器下显示从 List 继承的类的 ToString() 值?
【发布时间】:2013-03-07 19:10:27
【问题描述】:

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

【问题讨论】:

    标签: visual-studio visual-studio-debugging


    【解决方案1】:

    您需要创建自己的继承 .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();
        }
    }
    

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

    【讨论】:

    • 好的,但是我需要通过ToString()里面这个特定类型的属性来操作,所以这个方法应该知道类型。 MyList&lt;T&gt;: List&lt;T&gt;,然后 MySpecifiTypeList: MyList&lt;MySpecificType&gt; 对我没有帮助,与结果相同的 Count = 20
    • 迈克,你运行它来检查结果了吗?我复制并粘贴了您的代码,但不断得到 Count=2。请指教
    • 是的,我在一个测试项目中测试了所有这些代码,然后再把它放上去。在 SSCCE 中发布您的工作示例,我可以看到发生了什么。
    • 我使用的代码与您提供的完全相同,将其复制并按原样粘贴,得到相同的 Count=2。注意我说的是把鼠标悬停在strings 变量上,在我的情况下它不会运行 ToString()
    • 伙计,你让我在这里工作 :) 看起来当你将鼠标悬停在执行中断的对象上时,VS 不会在对象上调用 ToString()。您可以通过设置“调试器显示”属性来解决此问题。我已经更新了代码以向您展示如何做到这一点。现在,一切都应该按照您想要的方式进行。
    猜你喜欢
    • 2011-10-13
    • 2010-11-09
    • 2017-06-13
    • 1970-01-01
    • 2018-10-29
    • 2019-02-17
    • 2014-12-23
    • 2010-09-21
    • 2014-07-11
    相关资源
    最近更新 更多