2010-10-26 12 views
30

Stellen Sie sich eine Klasse mit vielen öffentlichen Eigenschaften vor. Aus irgendeinem Grund ist es nicht möglich, diese Klasse in kleinere Unterklassen umzuformen.Wie zeige ich automatisch alle Eigenschaften einer Klasse und ihre Werte in einer Zeichenkette an?

würde Ich mag eine ToString Überschreibung hinzufügen, die etwas entlang der Linien von zurückgibt:

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

Gibt es eine Möglichkeit, dies zu tun?

+0

Ich habe sich als Dumme zu schließen, aber eine Verschmelzung würde auch angemessen erscheinen. – mafu

Antwort

59

ich glaube, Sie hier eine wenig Reflexion nutzen können. Werfen Sie einen Blick auf 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 Schöne Antwort. Es liegt ein geringfügiger Fehler vor. _PropertyInfos ist immer null und sollte '_PropertyInfos = this.GetType(). GetProperties();' im if sein. –

+0

@ Conrad-Frix: Ja, du hast Recht. Behoben, aber wegen der Markierung als richtige Antwort und der Upvotes denke ich, dass jeder es bereits auf sich selbst fixiert hat. – Oliver

+0

Danke für diese Antwort. Außerdem wirft es Ausnahmen auf Null-Eigenschaftswerte. –

3

Sie können dies über Reflexion tun.

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

MyClass.GetType() wird nicht funktionieren. Sie sollten GetType() für eine Instanz von MyClass aufrufen. –

+0

Oder verwenden Sie typeof (MyClass) – VikciaR

1

Wenn Sie Zugriff auf den Code der Klasse müssen Sie dann können Sie nur ToString() Methode außer Kraft setzen. Wenn nicht, dann können Sie Reflections verwenden, um Informationen aus dem Type-Objekt zu lesen:

typeof(YourClass).GetProperties() 
16

@ Oliver Antwort als Erweiterung Methode (die ich Anzügen es gut denken)

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

Sie Inspiration von einer aufwendigeren Selbstbeobachtung des Staates aus dem Paket StatePrinter nehmen class introspector

Verwandte Themen