Pregunta: Estoy buscando una manera de simplificar la construcción de proxys tipo depurador para las clases heredadas. Por lo tanto, al depurar una clase que hereda de otra, debería ver las propiedades de ambas, una al lado de la otra: las propiedades base de la clase base, más las nuevas propiedades de la clase padre.¿Cómo puedo hacer que mi clase de destino DebuggerTypeProxy herede los proxies base?
Aquí es lo que he probado hasta ahora:
NewA
's tipo de proxy hereda de la deA
. Las propiedades no se muestran una al lado de la otra; las propiedades base son umbrella'd [sic] bajoBase
. *****- La inclusión de una característica en
A
NewA
que simplemente pone la corrienteNewA
aA
, con[DebuggerBrowsable(RootHidden)]
: Visual Studio se bloquea :(
Sé que solo podría añadir propiedades para la base clase en representación NewA
's, pero estoy tratando de evitar esto es demasiado trabajo para las clases con muchas propiedades
Explicación:..
Uso el atributo DebuggerTypeProxy
en algunas de mis clases para poder controlar cómo se ve la clase cuando se examina durante la depuración. Por ejemplo:
public class A {
private String _someField;
public String SomeField {
get {return _someField;}
}
}
Por defecto, la información sobre herramientas muestra información de depuración como:
... así que utilizo un DebuggerTypeProxy para ocultar el campo respaldo:
[DebuggerTypeProxy(typeof(AProxy))]
public class A {
// ...
internal class AProxy {
A _a;
AProxy (A a){
_a = a;
}
public String SomeField {
get {return _a.SomeField;}
}
}
}
... todo está bien con el mundo:
Ahora, puedo crear una clase que hereda de A.
public class NewA : A {
private String _anotherField;
public String AnotherField {
get {return _anotherField;}
}
}
Por desgracia, cuando la depuración de esta clase, Visual Studio utiliza el tipo de base de proxy (de A
). Esto significa que podemos ver la propiedad de base SomeField
, pero nuestro nuevo AnotherField
propiedad está escondida (a menos que se expande Raw View
, por supuesto):
Extracción del tipo de proxy de la base A
resultados en AnotherField
muestra, pero no SomeField
.
* intento fallido # 1
/// <summary>
/// The base class
/// </summary>
[DebuggerTypeProxy(typeof(AProxy))]
public class A {
private String _someField;
public String SomeField {
get { return _someField; }
}
protected class AProxy {
A _a;
protected AProxy(A a) {
_a = a;
}
String SomeField {
get { return _a.SomeField; }
}
}
}
/// <summary>
/// Parent class
/// </summary>
[DebuggerTypeProxy(typeof(NewAProxy))]
public class NewA : A {
private String _anotherField;
public String AnotherField {
get { return _anotherField; }
}
// Inherit base type proxy, in an effort to display base properties
// side-by-side with AnotherField: Doesn't work.
protected class NewAProxy : A.AProxy {
NewA _newA;
protected NewAProxy(NewA newA)
: base(newA) {
_newA = newA;
}
public String AnotherField {
get { return _newA.AnotherField; }
}
}
}
Resultado:
todavía no funciona. Las propiedades base no se colocan lado a lado con las nuevas propiedades.
también puede habilitar DebuggerBrowsableAttributes para las propiedades. –