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

maf*_*afu 34 .net c# properties tostring

想象一下有很多公共财产的班级.出于某种原因,不可能将此类重构为较小的子类.

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

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

有没有办法做到这一点?

Oli*_*ver 79

我想你可以在这里使用一点反思.看看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();
}
Run Code Online (Sandbox Code Playgroud)

  • +1很好的答案.存在轻微缺陷._PropertyInfos总是为null,它应该是`_PropertyInfos = this.GetType().GetProperties();`if. (3认同)
  • @AlexRice:是的,你是对的.我想,遇到这个问题的每个人都自己解决了这个问题.但是,拥有一个也考虑到这一点的复制和粘贴解决方案,使每个人都更容易.所以我改变了代码来处理空值. (3认同)
  • 这里只是更新一下,您实际上不必缓存 propertyinfo。它已由运行时内部缓存 [RuntimeTypeCache](https://source.dot.net/#System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs,d5408107ab8096c8)。当你第二次访问它时,它会很便宜。 (2认同)

Pan*_*ood 24

@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();
}
Run Code Online (Sandbox Code Playgroud)