3

Очень глупый вопрос, но я просто не могу найти ответ.Какие средства DebuggerVisualizers уже существуют в VisualStudio или .NET Framework?

У меня есть самостоятельный класс, который реализует интерфейс IList<T>. Теперь мне нравится видеть содержащиеся элементы в Debugging, как я бы с любым .Net List<T>.

Чтобы заставить это работать, я думаю, что должен предоставить правильный визуализатор в пределах DebuggerVisualizerAttribute. После небольшого поиска всего, что я смог найти, это the folder for additional Visualizer. Но для DataSet есть только один.

Но каковы типы всех визуализаторов, уже доступных в Visual Studio (например, для строки, списка и т. Д.), Чтобы я мог предоставить правильный вариант для моей реализации уже имеющегося?

+2

Точный дубликат: http://stackoverflow.com/questions/4886836/what-debuggervisualizers-are-already-existing -within-VisualStudio или внутрисетевой-framewo – sisve

ответ

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, если они решают переименовать внутренний класс.

0

Вы можете добавить атрибут к вам класса System.Diagnostics.DebuggerVisualizerAttribute с типом визуализатора в аргументе

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, но это дало нулевой результат (возможно, потому, что узлы в определенной папке нет ссылок). Если вы ссылаетесь на сборки в папке, вы можете использовать указанное выше выражение, чтобы найти там реализации.