C#重写MyList<T>的ToString()在VS2012调试器不生效问题
嘿,我懂你碰到的这个坑了——Visual Studio的调试器对集合类型有自己的一套显示逻辑,单纯重写ToString()根本没用,它默认只会揪着Count这类集合的核心属性展示,才不会主动调用你的ToString方法呢。给你两个靠谱的解决方案,亲测在VS2012里有效:
方案一:用
DebuggerDisplayAttribute快速自定义显示文本 这是最直接的方式,只需要在你的MyList<T>类上加上这个特性,就能指定调试器显示的内容。特性里可以直接写表达式,调用类里的方法或者访问属性都没问题。
using System; using System.Collections.Generic; using System.Diagnostics; // 必须引用这个命名空间 [DebuggerDisplay("MyList | 元素总数: {Count}, 预览: {GetDebugPreview()}")] public class MyList<T> : List<T> { // 专门给调试器用的预览方法 private string GetDebugPreview() { switch (Count) { case 0: return "空列表"; case 1: return this[0]?.ToString() ?? "null元素"; default: return $"{this[0]}, {this[1]}... 还有{Count - 2}个元素"; } } // 保留ToString重写,方便非调试场景使用 public override string ToString() { return GetDebugPreview(); } }
编译后再调试,你就能看到调试器里显示你定义的自定义文本,而不是默认的Count = X了。
方案二:用
DebuggerTypeProxyAttribute打造完全自定义的调试视图 如果你想更灵活地控制调试时的展开结构(比如添加额外的统计信息、分组显示元素),可以用这个特性,给你的类指定一个调试代理类,调试器会用这个代理类的结构来展示你的对象。
using System; using System.Collections.Generic; using System.Diagnostics; public class MyList<T> : List<T> { // 指定调试代理类 [DebuggerTypeProxy(typeof(MyListDebugView<>))] private class MyListDebugView<U> { private readonly MyList<U> _targetList; // 代理类需要接收原对象作为构造参数 public MyListDebugView(MyList<U> list) { _targetList = list; } // 调试器会展示这些自定义属性 public int 元素总数 => _targetList.Count; public string 列表状态 => _targetList.Count == 0 ? "空列表" : $"包含{_targetList.Count}个元素"; public U[] 全部元素 => _targetList.ToArray(); // 直接展示数组形式的元素 } }
用这个方案,调试时展开你的MyList<T>对象,就能看到你在代理类里定义的所有属性,完全替代默认的集合视图。
最后提醒下:修改代码后一定要重新编译项目,调试器才会加载新的调试显示设置哦。
内容的提问来源于stack exchange,提问作者AndreasW
相关产品推荐
相关产品推荐

