一个相当愚蠢的问题,但我根本找不到答案。
我有一个自编写的类,它实现了IList<T>
接口。现在我希望看到Debugging中的包含元素,就像我对任何.Net List<T>
。
为了让这个工作,我想我必须在DebuggerVisualizerAttribute
内提供正确的可视化工具。经过一番搜索,我发现只有the folder for additional Visualizer。但是DataSet只有一个。
但是Visual Studio中已经可用的所有Visualizer的类型是什么(例如,对于字符串,List等),以便我可以为我已经可用的东西提供正确的类型?
答案 0 :(得分:4)
.NET框架类使用的调试器可视化器是内部的。这使得它们有点难以使用,你不能使用typeof()。但是有一个后门,[DebuggerTypeProxy]属性也有一个接受字符串的构造函数。您要使用的名称为Mscorlib_CollectionDebugView,它能够可视化任何实现ICollection&lt;&gt;的类。以下是一个使用示例:
[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。
答案 1 :(得分: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
,但这会得到零结果(可能是因为未引用特定文件夹中的程序集)。如果引用文件夹中的程序集,则可以使用上面的表达式来查找那里的实现。
答案 2 :(得分:2)
有一篇关于如何创建自己的List调试器的好文章:
答案 3 :(得分:0)
您可以使用参数
中的可视化工具类型向类System.Diagnostics.DebuggerVisualizerAttribute
添加属性