2008-11-03 12 views
12

tengo un problema al aplicar el atributo DebuggerDisplay en una clase genérica:DebuggerDisplay en clase genérica

[DebuggerDisplay("--foo--")] 
class Foo 
{ 
} 

[DebuggerDisplay("Bar: {t}")] 
class Bar<T> 
{ 
    public T t; 
} 

Al inspeccionar un objeto de tipo Bar<Foo> yo esperaría que se muestre como Bar: --foo--, pero me da Bar: {Foo}

¿Qué estoy haciendo mal?

Respuesta

19

El atributo DebuggerDisplay no es recursivo. El {} dentro de la cadena básicamente dice evaluar esta expresión y mostrar el resultado en línea. La cadena para el resultado interno se calcula como si no hubiera un atributo DebuggerDisplay en juego para tipo o miembro. Es por eso que ves {Foo} en lugar de --foo--.

El motivo es la fiabilidad. Es demasiado fácil tener etiquetas de atributos DebuggerDisplay mutuamente recursivas. Esto causaría un desbordamiento de pila o un bucle infinito al evaluar una expresión interna. La evaluación no recursiva del atributo DebuggerDisplay evita esta recursión infinita (aunque todavía es bastante posible que el usuario la cree ellos mismos dentro de una expresión particular).

Una forma de controlar la forma en que se muestra la expresión interna es anulando el método .ToString(). Esto se evaluará al calcular la cadena de visualización para una expresión interna.

+0

Gracias! Entonces, no tiene nada que ver con ser genérico. Iré por la solución ToString. –

0

Puede usar [DebuggerDisplay("Bar<{typeof(T).Name}>,nq}")]//nq - no quotes.

También puede utilizar estas prácticas: DebuggerDisplay attribute best practices

+0

Creo que debería leer: '[DebuggerDisplay (" Barra <{typeof (T) .Name, nq}> ")]' – DavWEB

2

[Disclaimer: estoy afiliado a OzCode]

Puede utilizar OzCode característica que soporta la información de depuración anidada/recursivo de Reveal. enter image description here
Una vez que lo haya definido para una instancia, se usará automáticamente para todas las instancias de ese tipo.

Cuestiones relacionadas