如何在 Visual Studio 中生成包含所有属性的 ToString()?

How do I generate a ToString() in Visual Studio that includes all properties?

我是一名 Java 开发人员,习惯于 Eclipse 中的 'generate toString()' 选项,它提供了一个完整的 toString,打印所有实例变量的值。我只是在 Visual Studio.

中寻找类似的快捷方式

我已经了解了您如何开始输入方法,"public override " 并且自动完成将存根 ToString() 但它不会用所有 class 属性填充它。

    public override string ToString()
        {
            return base.ToString();
        }

我希望生成的方法包含 class 的所有属性。

你可以这样做:

 public override string ToString()
 {
     return "First name: " + FirstName + ", Last name: " + LastName;
 }

或者更好的解决方案:

 public override string ToString()
 {
     return nameof(FirstName) + FirstName + ", " nameof(LastName) + LastName;
 }

如有必要,在 属性 上使用强制转换。

我认为 Visual Studio 没有立即执行那种代码生成的操作。 但是,您可以使用 Visual Studio 的首选扩展来做到这一点:JetBrains Resharper。

它具有快速生成 ToString 的功能(以及许多其他功能)。

https://www.jetbrains.com/help/resharper/Code_Generation__Formatting_Members.html

默认情况下没有办法做到这一点 - 您在 Eclipse 中看到的是 Eclipse 的优点,而不是运行时的内置功能。您可以自己编写 VS 的扩展程序(查看我的评论),也可以使用执行此操作的扩展程序。我知道 Resharper offers the facility,但我必须强调 SO 不是 "find me a library that does..." 服务,因此我不以任何方式对 Re# 提供任何认可或推荐

可能还值得指出的是:

  1. 您可以在功能强大的文本编辑器中相对轻松地做到这一点
  2. 您可以编写一个小应用程序,在将 class 复制到剪贴板时生成 tostring
  3. 你可以放下对它的渴望;在 c# 中,我们并没有真正像 java bods 那样广泛地使用 ToString(),因为自 IDE 首次发布以来,我们已经在 IDE 中内置了一个很棒的步骤调试器。我们很少需要将我们的对象字符串化并将它们转储到命令行以随时检查程序对象的状态,因为我们可以暂停它并在 Locals window 等中查看它。如果你不是完全跟上调试器可以为您做的一切我建议看一些视频

选项 1:反思

您可以使用反射来做到这一点。但如果您必须在短时间内非常频繁地调用该方法,这可能会导致性能问题。用反射编码并不是那么简单。

  • Dynamic override of ToString() using Reflection
  • How do I automatically display all properties of a class and their values in a string?



选项 2:Resharper

Visual Studio 插件 Resharper 具有此功能:

alt + 插入 -> 生成 -> 格式化成员 -> select 全部 -> 完成



选项 3:Fody/ToString nuget 包

可能是最简单的解决方案,当您只需要 public 属性时。它不适用于 public 个字段。

您可以使用 JSON.NET 序列化您的 class。

public override string ToString()
{
    return JsonConvert.SerializeObject(this);
}

没有与您所说的 Java 和 Eclipse 相同的东西。

@RawitasKrungkaew 回答的很好。

如果你不想使用JSON,你可以使用带有扩展方法的反射来具有可重用性:

In some class

public override string ToString()
{
  return this.GetPropertiesAsText();
}

PropertiesListerHelper.cs

using System.Reflection;

static public class PropertiesListerHelper
{
  static private bool IsProcessing;

  static public string GetPropertiesAsText(this object instance)
  {
    if ( IsProcessing )
      return $"<Reentrancy in {instance.GetType().Name}.ToString()>";
    IsProcessing = true;
    try
    {
      string result = "";
      var list = instance.GetType().GetProperties().OrderBy(item => item.Name);
      foreach ( var property in list )
      {
        var value = property.GetValue(instance);
        result += $"{property.Name} = {(value == null ? "<null>" : value)}, ";
      }
      return result.TrimEnd(", ".ToArray());
    }
    catch ( Exception ex )
    {
      return $"<Exception in {instance.GetType().Name}.ToString(): {ex.Message}>";
    }
    finally
    {
      IsProcessing = false;
    }
  }
}

因此,即使 class 设计发生变化,行为仍然有效。

您可以根据需要调整该方法以格式化输出,例如:

foreach ( var property in list )
{
  var value = property.GetValue(instance);
  result += $"{property.Name} = {(value == null ? "<null>" : value)}"
          + Environment.NewLine;
}
return result.TrimEnd(Environment.NewLine.ToArray());

可能会改进对重入情况的管理,因为它可能会导致表单堆栈溢出。

答案中未提及的另一种方法是使用以下 Visual Studio 扩展名:https://marketplace.visualstudio.com/items?itemName=DavideLettieri.AutoToString。安装扩展程序后,在 class 正文中按 Ctrl + .,将可以进行额外的 Generate ToString() 操作。