2010-10-26 20 views
30

Imagine una clase con muchas propiedades públicas. Por alguna razón, es imposible refactorizar esta clase en subclases más pequeñas.¿Cómo se muestran automáticamente todas las propiedades de una clase y sus valores en una cadena?

Me gustaría añadir una anulación ToString que devuelve algo a lo largo de las líneas de:

 
Property 1: Value of property 1\n 
Property 2: Value of property 2\n 
... 

¿Hay una manera de hacer esto?

+0

Voté para cerrar como una estafa, pero una fusión también parece apropiada. – mafu

Respuesta

59

Creo que se puede utilizar un poco de reflexión aquí. Eche un vistazo al Type.GetProperties().

private PropertyInfo[] _PropertyInfos = null; 

public override string ToString() 
{ 
    if(_PropertyInfos == null) 
     _PropertyInfos = this.GetType().GetProperties(); 

    var sb = new StringBuilder(); 

    foreach (var info in _PropertyInfos) 
    { 
     var value = info.GetValue(this, null) ?? "(null)"; 
     sb.AppendLine(info.Name + ": " + value.ToString()); 
    } 

    return sb.ToString(); 
} 
+3

+1 Nice answer. Hay un defecto menor _PropertyInfos siempre es nulo, debe ser '_PropertyInfos = this.GetType(). GetProperties();' en if. –

+0

@ conrad-frix: Sí, tienes razón. Se corrigió, pero debido a que la marca es la respuesta correcta y las votaciones ascendentes, creo que todos ya lo arreglaron. – Oliver

+0

Gracias por esta respuesta. Por cierto, arroja excepciones sobre valores de propiedad nulos. –

3

Puede hacerlo a través de la reflexión.

PropertyInfo[] properties = MyClass.GetType().GetProperties(); 
foreach(PropertyInfo prop in properties) 
{ 
... 
} 
+0

MyClass.GetType() no funcionará. Debería llamar a GetType() en la instancia de MyClass. –

+0

O use typeof (MyClass) – VikciaR

1

Si usted tiene acceso al código de la clase que necesita a continuación, puedes anular ToString() método. Si no, entonces usted puede utilizar Reflections para leer la información del objeto Tipo:

typeof(YourClass).GetProperties() 
16

@ respuesta de Oliver como un método de extensión (que creo que se adapte bien)

public static string PropertyList(this object obj) 
{ 
    var props = obj.GetType().GetProperties(); 
    var sb = new StringBuilder(); 
    foreach (var p in props) 
    { 
    sb.AppendLine(p.Name + ": " + p.GetValue(obj, null)); 
    } 
    return sb.ToString(); 
} 
1

Puede tomar la inspiración de una introspección más elaborada de estado del paquete StatePrinter class introspector

Cuestiones relacionadas