2010-10-26 8 views
30

Immagina una classe con molte proprietà pubbliche. Per qualche ragione, è impossibile ricondurre questa classe in sottoclassi più piccole.Come si visualizzano automaticamente tutte le proprietà di una classe e i relativi valori in una stringa?

vorrei aggiungere una sostituzione ToString che restituisce qualcosa sulla falsariga di:

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

C'è un modo per fare questo?

+0

Ho votato chiudere come un duplicato, ma anche un'unione sembrerebbe appropriata. – mafu

risposta

59

Penso che si può usare un po 'di riflessione qui. Dai un'occhiata a 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 Bella risposta. C'è un difetto minore. _PropertyInfos è sempre nullo dovrebbe essere '_PropertyInfos = this.GetType(). GetProperties();' nel if. –

+0

@ conrad-frix: Sì, hai ragione. Risolto il problema, ma a causa del marchio come risposta corretta e degli upvotes penso che tutti lo abbiano già risolto su se stesso. – Oliver

+0

Grazie per questa risposta. btw genera eccezioni su valori di proprietà nulli. –

3

È possibile farlo tramite riflessione.

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

MyClass.GetType() non funzionerà. Dovresti chiamare GetType() su istanza di MyClass. –

+0

Oppure usa typeof (MyClass) – VikciaR

1

Se si ha accesso al codice della classe è necessario, allora si può semplicemente ignorare ToString() metodo. Se poi non si può utilizzare Reflections per leggere le informazioni dall'oggetto Type:

typeof(YourClass).GetProperties() 
16

@ risposta di Oliver come un metodo di estensione (che credo si adatta bene)

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

Si può prendere spunto da un'introspezione più elaborato di stato dal pacchetto StatePrinter class introspector

Problemi correlati