如何在字符串中自动显示类的所有属性及其值?

时间:2010-10-26 12:06:39

标签: c# .net properties tostring

想象一下有很多公共属性的类。出于某种原因,不可能将此类重构为较小的子类。

我想添加一个ToString覆盖,它返回以下内容:

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

有办法做到这一点吗?

5 个答案:

答案 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

中更精细地反省状态中获取灵感