A quite dumb question but i simply can't find the answer.
I have a self-written class that implements the IList<T>
interface. Now i like to see the containing elements within Debugging like i would with any .Net List<T>
.
To get this to work i think i have to provide the correct visualizer within the DebuggerVisualizerAttribute
. After a little searching all i could find is the folder for additional Visualizer. But there is just one for the DataSet.
But what are the types of all the Visualizer already available within Visual Studio (e.g. for string, List, etc.), so that i could provide the correct one for my implementation of something already available?
The debugger visualizers used by the .NET framework classes are internal. Which makes them a bit hard to use, you cannot use typeof(). There's a backdoor though, the [DebuggerTypeProxy] attribute also has a constructor that accepts a string. The one you want to use is named Mscorlib_CollectionDebugView, it is capable of visualing any class that implements ICollection<>. Here's an example of usage:
[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(); }
}
This works for .NET 4.0 as well, even though the version number is wrong. This otherwise has a risk of breaking with the next version of .NET if they decide to rename the internal class.