想象一下有很多公共属性的类。出于某种原因,不可能将此类重构为较小的子类。
我想添加一个ToString覆盖,它返回以下内容:
Property 1: Value of property 1\n Property 2: Value of property 2\n ...
有办法做到这一点吗?
答案 0 :(得分:72)
我想你可以在这里使用一点反思。看看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();
}
答案 1 :(得分:23)
@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();
}
答案 2 :(得分:3)
你可以通过反思来做到这一点。
PropertyInfo[] properties = MyClass.GetType().GetProperties();
foreach(PropertyInfo prop in properties)
{
...
}
答案 3 :(得分:1)
如果您可以访问所需类的代码,则可以覆盖ToString()
方法。如果没有,那么您可以使用Reflections从Type对象中读取信息:
typeof(YourClass).GetProperties()
答案 4 :(得分:1)
您可以从StatePrinter包class introspector
中更精细地反省状态中获取灵感