多くのパブリックプロパティを持つクラスを想像してください。何らかの理由で、このクラスを小さなサブクラスにリファクタリングすることは不可能です。
次の行に沿って何かを返すToStringオーバーライドを追加したいと思います。
プロパティ1:プロパティ1の値\ n プロパティ2:プロパティ2の値\ n ...
これを行う方法はありますか?
ここで少し反射を使用できると思います。 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();
}
拡張メソッドとしての@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();
}
リフレクションを介してこれを行うことができます。
PropertyInfo[] properties = MyClass.GetType().GetProperties();
foreach(PropertyInfo prop in properties)
{
...
}
StatePrinterパッケージから状態のより精巧なイントロスペクションからインスピレーションを得ることができます class introspector
必要なクラスのコードにアクセスできる場合は、ToString()
メソッドをオーバーライドできます。そうでない場合は、 Reflections を使用してTypeオブジェクトから情報を読み取ることができます。
typeof(YourClass).GetProperties()