3

一个非常愚蠢的问题,但我根本找不到答案。

IList<T>我有一个实现接口的自写类。现在我喜欢在 Debugging 中查看包含的元素,就像使用任何 .Net 一样List<T>

为了让它工作,我认为我必须在DebuggerVisualizerAttribute. 经过一番搜索后,我只能找到附加 Visualizer 的文件夹。但是DataSet 只有一个。

但是 Visual Studio 中已经可用的所有 Visualizer 的类型是什么(例如,用于字符串、列表等),以便我可以为我实现已经可用的东西提供正确的类型?

4

4 回答 4

4

.NET 框架类使用的调试器可视化工具是内部的。这使得它们有点难以使用,你不能使用 typeof()。虽然有一个后门,但 [DebuggerTypeProxy] 属性也有一个接受字符串的构造函数。您要使用的名为 Mscorlib_CollectionDebugView,它能够可视化任何实现 ICollection<> 的类。这是一个使用示例:

[DebuggerTypeProxy("System.Collections.Generic.Mscorlib_CollectionDebugView`1, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
class MyCollection<T> : IList<T> {
    private List<T> impl = new List<T>();
    public int IndexOf(T item) {  return impl.IndexOf(item); }
    public void Insert(int index, T item) { impl.Insert(index, item); }
    public void RemoveAt(int index) { impl.RemoveAt(index); }
    public T this[int index] {
        get { return impl[index]; }
        set { impl[index] = value; }
    }
    public void Add(T item) { impl.Add(item); }
    public void Clear() { impl.Clear(); }
    public bool Contains(T item) { return impl.Contains(item); }
    public void CopyTo(T[] array, int arrayIndex) { impl.CopyTo(array, arrayIndex); }
    public int Count { get { return impl.Count; }}
    public bool IsReadOnly { get { return ((System.Collections.IList)impl).IsReadOnly; }}
    public bool Remove(T item) { return impl.Remove(item); }
    public IEnumerator<T> GetEnumerator() { return impl.GetEnumerator(); }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); }
}

这也适用于 .NET 4.0,即使版本号错误。否则,如果他们决定重命名内部类,则可能会与 .NET 的下一版本中断。

于 2011-02-03T14:48:56.943 回答
2

List<T>使用DebuggerTypeProxyAttribute为调试器定义代理。您可以使用以下表达式找到所有内容:

var types =
    from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in assembly.GetTypes()
    from attribute in type.GetCustomAttributes(typeof(DebuggerTypeProxyAttribute), true)
    select ((DebuggerTypeProxyAttribute)attribute).ProxyTypeName;

使用上面的表达式,您也可以测试DebuggerVisualizerAttribute,但这给出了零结果(可能是因为未引用特定文件夹中的程序集)。如果您引用文件夹中的程序集,您可以使用上面的表达式在那里找到实现。

于 2011-02-03T13:56:59.403 回答
2

有一篇关于如何制作自己的 List 调试器的好文章:

http://www.codeproject.com/KB/debug/DebugIList.aspx

于 2011-11-19T20:08:36.873 回答
0

System.Diagnostics.DebuggerVisualizerAttribute您可以使用参数中的可视化器类型向您的类添加属性

于 2011-02-03T13:45:34.253 回答