有没有办法在类上自动覆盖ToString()?

Rob*_*ood 10 .net c#

我发现在我编写的许多简单的DTO/POCO类上重写ToString()很有用,当将鼠标悬停在调试器中的实例上时显示一些好的信息.

这是一个例子:

  public class IdValue< T >
  {
    public IdValue( int id, T value )
    {
      Id = id;
      Value = value;
    }

    public int Id { get; private set; }
    public T Value { get; private set; }

    public override string ToString()
    {
      return string.Format( "Id: {0} Value: {1}", Id, Value );
    }
  }
Run Code Online (Sandbox Code Playgroud)

在.NET中有没有办法自动拥有一个ToString()覆盖,列出公共属性或者是否有一个好的约定?

Jos*_*osh 16

您可以在基类中重写ToString,然后在实例上使用反射来发现派生类的公共属性.但这可能会在代码的其他方面引入性能问题.另外,因为ToString被很多东西(String.Format,默认数据绑定等)使用而覆盖ToString用于调试目的会使你的类在其他场景中不那么有用.

相反,您可能希望使用DebuggerDisplay属性来控制调试器在监视窗口中显示悬停提示和信息的方式等.如果你将它应用于基类,我很确定这是有效的.您还可以创建自定义可视化工具,但更复杂.有关增强调试器显示体验的更多信息,请查看此链接.

增强调试