2011-06-28 5 views
5

Creé formulario con cuadrícula para visualizar cualquier objeto de recopilación (ICollection, ICollection<T>).Visualizador de depuración para cualquier ICollection e ICollection <T> tipos

Después de eso creé la clase de visualizador de depuración (hereda de Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer).

El visualizador está instalado correctamente (lo probé en la clase System.Collections.ArrayList).

Pero tengo un problema con generalizar el visualizador a cualquier tipo ICollection/ICollection<T>.

que especifica el atributo:

[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")] 

pero el visualizador no es ofrecido por VS en depuración.

Si especifico el nombre exacto de la clase, el visualizador está disponible en VS. ¿Hay forma, cómo llevar a cabo mi intención o no hay forma, cómo lograrla?

Gracias!

Respuesta

9

creo que haya tropezado en la misma limitación de la arquitectura como visualizadores outlined in this question.

La solución consiste en crear un visualizador de System.WeakReference y, a continuación, escribir en la ventana Inspección "nueva WeakReference (myCollectionVariable) ", y luego podrá abrir su visualizador de depuración en la referencia débil. Dentro de su visualizador de depuración puede usar la reflexión para averiguar exactamente qué tipo de variable es y hacer lo que quiera con ella.

Véase también this.

+0

¡Gracias! La solución parece un poco loca. Pero será propagablemente única manera, cómo lograr mi propósito. – TcKs

+0

¿El problema es que no puede crear un visualizador para una clase genérica, o que no puede registrar el mismo visualizador para 2 tipos "diferentes"? –

+3

Los visualizadores del depurador no funcionarán en los tipos de interfaz, solo en las clases (excepto System.Array y System.Object). Tienes que especificar una clase específica. Puede crear un visualizador para una clase genérica, pero el soporte está limitado a los tipos genéricos abiertos, como se documenta en: http://msdn.microsoft.com/en-us/library/e2zc529c.aspx –

0

Esto funcionará bien, supongo.

[assembly: DebuggerVisualizer(typeof(DebugerSide), typeof(VisualizerObjectSource), typeof(Collection), Description = "Collection visualizer")] 
Cuestiones relacionadas