2011-06-28 10 views
5

Utworzono formularz z siatką do wizualizacji dowolnego obiektu kolekcji (ICollection, ICollection<T>).Wizualizator debuggera dla dowolnego ICollection i ICollection <T> typy

Następnie utworzyłem klasę wizualizatora debuggera (dziedziczy po Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer).

Wizualizer jest zainstalowany prawidłowo (próbowałem go na klasie System.Collections.ArrayList).

Ale mam problem z uogólnieniem wizualizatora na dowolny typ ICollection/ICollection<T>.

I określony atrybut:

[assembly: DebuggerVisualizer(typeof(DebugerSide), typeof(VisualizerObjectSource), Target = typeof(System.Collections.Generic.ICollection<>), Description = "Collection visualizer")] 
[assembly: DebuggerVisualizer(typeof(DebugerSide), typeof(VisualizerObjectSource), Target = typeof(System.Collections.ICollection), Description = "Collection visualizer")] 

ale wizualizer nie jest oferowany przez VS w debugowania.

Jeśli podam dokładną nazwę klasy, wizualizator jest dostępny w VS. Czy istnieje sposób, jak wykonać moją intencję lub nie ma sposobu, jak to osiągnąć?

Dzięki!

Odpowiedz

9

myślę, że natknęliśmy się w tym samym ograniczenia architektury wizualizacje jako outlined in this question.

Rozwiązaniem jest stworzenie Visualizer dla System.WeakReference, a następnie wpisać w oknie Watch „nowy WeakReference (myCollectionVariable) ", a następnie będziesz mógł otworzyć wizualizator debugowania na słabych referencjach. Wewnątrz wizualizatora debugowania możesz użyć refleksji, aby dowiedzieć się, jaki jest dokładnie typ twojej zmiennej i robić, co chcesz.

Zobacz także this.

+0

Dziękujemy! Obejście to wygląda na zwariowanego. Ale będzie to prawdopodobnie jedyna droga, jak osiągnąć mój cel. – TcKs

+0

Problem polega na tym, że nie można utworzyć wizualizatora dla klasy ogólnej lub że nie można zarejestrować tego samego wizualizatora dla 2 "różnych" typów? –

+3

Wizualizatory debuggera nie będą działały na typach interfejsów, tylko na klasach (z wyjątkiem System.Array i System.Object). Musisz określić konkretną klasę. Możesz utworzyć wizualizator dla klasy ogólnej, ale wsparcie jest ograniczone do otwartych typów ogólnych - jak udokumentowano na: http://msdn.microsoft.com/en-us/library/e2zc529c.aspx –

0

To zadziała dobrze, jak sądzę.

[assembly: DebuggerVisualizer(typeof(DebugerSide), typeof(VisualizerObjectSource), typeof(Collection), Description = "Collection visualizer")] 
Powiązane problemy