web-dev-qa-db-ja.com

クラスのすべてのプロパティとその値を文字列で自動的に表示するにはどうすればよいですか?

多くのパブリックプロパティを持つクラスを想像してください。何らかの理由で、このクラスを小さなサブクラスにリファクタリングすることは不可能です。

次の行に沿って何かを返すToStringオーバーライドを追加したいと思います。

プロパティ1:プロパティ1の値\ n 
プロパティ2:プロパティ2の値\ n 
 ... 

これを行う方法はありますか?

35
mafu

ここで少し反射を使用できると思います。 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

拡張メソッドとしての@Oliverの答え(私はそれに適していると思います)

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

リフレクションを介してこれを行うことができます。

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

StatePrinterパッケージから状態のより精巧なイントロスペクションからインスピレーションを得ることができます class introspector

1
Carlo V. Dango

必要なクラスのコードにアクセスできる場合は、ToString()メソッドをオーバーライドできます。そうでない場合は、 Reflections を使用してTypeオブジェクトから情報を読み取ることができます。

typeof(YourClass).GetProperties()
1
Andrew Bezzub