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

发布于 2024-09-29 16:20:37 字数 185 浏览 7 评论 0原文

想象一个具有许多公共属性的类。由于某种原因,不可能将此类重构为更小的子类。

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

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

有没有办法做到这一点?

Imagine a class with many public properties. For some reason, it is impossible to refactor this class into smaller subclasses.

I'd like to add a ToString override that returns something along the lines of:

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

Is there a way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

ら栖息 2024-10-06 16:20:38

我认为你可以在这里进行一些反思。看一下 Type.GetProperties()

public override string ToString()
{
    return GetType().GetProperties()
        .Select(info => (info.Name, Value: info.GetValue(this, null) ?? "(null)"))
        .Aggregate(
            new StringBuilder(),
            (sb, pair) => sb.AppendLine($"{pair.Name}: {pair.Value}"),
            sb => sb.ToString());
}

I think you can use a little reflection here. Take a look at Type.GetProperties().

public override string ToString()
{
    return GetType().GetProperties()
        .Select(info => (info.Name, Value: info.GetValue(this, null) ?? "(null)"))
        .Aggregate(
            new StringBuilder(),
            (sb, pair) => sb.AppendLine(
quot;{pair.Name}: {pair.Value}"),
            sb => sb.ToString());
}
吻风 2024-10-06 16:20:38

@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();
}

@Oliver's answer as an extension method (which I think suits it well)

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();
}
旧夏天 2024-10-06 16:20:38

您可以通过反射来做到这一点。

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

You can do this via reflection.

PropertyInfo[] properties = MyClass.GetType().GetProperties();
foreach(PropertyInfo prop in properties)
{
...
}
緦唸λ蓇 2024-10-06 16:20:38

You can take inspiration from a more elaborate introspection of state from the StatePrinter package class introspector

朱染 2024-10-06 16:20:38

如果您有权访问所需类的代码,那么您只需重写 ToString() 方法即可。如果没有,那么您可以使用 Reflections从 Type 对象读取信息:

typeof(YourClass).GetProperties()

If you have access to the code of the class you need then you can just override ToString() method. If not then you can use Reflections to read information from the Type object:

typeof(YourClass).GetProperties()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文