2010-10-26 21 views
30

Imaginez une classe avec de nombreuses propriétés publiques. Pour une raison quelconque, il est impossible de refactoriser cette classe en sous-classes plus petites.Comment afficher automatiquement toutes les propriétés d'une classe et leurs valeurs dans une chaîne?

Je voudrais ajouter une dérogation ToString qui retourne quelque chose le long des lignes de:

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

Est-il possible de le faire?

+0

J'ai voté pour fermer comme dupe, mais une fusion semblerait appropriée, aussi. – mafu

Répondre

59

Je pense que vous pouvez utiliser un peu de réflexion ici. Jetez un oeil à 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 Bonne réponse. Il y a un défaut mineur. _PropertyInfos est toujours null il devrait être '_PropertyInfos = this.GetType(). GetProperties();' dans le if. –

+0

@ conrad-frix: Oui, vous avez raison. Je l'ai corrigé, mais à cause de la marque comme bonne réponse et des upvotes, je pense que tout le monde l'a déjà corrigé. – Oliver

+0

Merci pour cette réponse. btw il jette des exceptions sur les valeurs de propriétés nulles. –

3

Vous pouvez le faire par réflexion.

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

MyClass.GetType() ne fonctionnera pas. Vous devriez appeler GetType() sur l'instance de MyClass. –

+0

Ou utilisez typeof (MyClass) – VikciaR

1

Si vous avez accès au code de la méthode classe, vous devez alors vous pouvez simplement remplacer ToString(). Sinon, vous pouvez utiliser Reflections pour lire les informations de l'objet Type:

typeof(YourClass).GetProperties() 
16

@ réponse d'Oliver comme méthode d'extension (qui je pense convient 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

Vous pouvez prendre l'inspiration d'une introspection plus élaborée de l'état de l'emballage StatePrinter class introspector