web-dev-qa-db-fra.com

Comment afficher automatiquement toutes les propriétés d'une classe et leurs valeurs dans une chaîne?

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.

Je voudrais ajouter un remplacement ToString qui renvoie quelque chose dans le sens de:

 Propriété 1: valeur de la propriété 1\n 
 Propriété 2: valeur de la propriété 2\n 
 ... 

Y a-t-il un moyen de faire cela?

35
mafu

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();
}
82
Oliver

@ La réponse d'Oliver comme méthode d'extension (ce qui, je pense, lui 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();
}
25
PandaWood

Vous pouvez le faire via la réflexion.

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

Vous pouvez vous inspirer d'une introspection d'état plus élaborée à partir du package StatePrinter classe introspector

1
Carlo V. Dango

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

typeof(YourClass).GetProperties()
1
Andrew Bezzub