Как создать ToString () в Visual Studio, которая включает в себя все свойства? - PullRequest
0 голосов
/ 30 октября 2019

Я - Java-разработчик, привыкший к опции 'generate toString ()' в Eclipse, которая предлагает полный toString, печатая значения всех переменных экземпляра. Я просто ищу сопоставимый ярлык в Visual Studio.

Я видел, как вы можете начать вводить метод, "public override" и autocomplete заглушит ToString (), но он не заполнит егосо всеми свойствами класса.

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

Я бы хотел, чтобы сгенерированный метод включал все свойства класса.

Ответы [ 6 ]

3 голосов
/ 30 октября 2019

Вы можете использовать JSON.NET для сериализации вашего класса.

public override string ToString()
{
    return JsonConvert.SerializeObject(this);
}
3 голосов
/ 30 октября 2019

Вариант 1: Отражение

Вы можете сделать это с помощью отражения. Но это может вызвать проблемы с производительностью, если вам придется вызывать этот метод очень часто в течение короткого времени. И это не так просто для кода с отражением.

Вариант 2: Resharper

В дополнении к Visual Studio Resharper есть эта функция:

alt + Вставить -> Создать -> Форматирование элементов -> выбрать все -> Готово

Вариант 3: пакет nuget Fody / ToString

Вероятно, самое простое решение, когда вам нужны только публичные свойства. Не работает с открытыми полями.

1 голос
/ 30 октября 2019

Нет эквивалента тому, что вы говорите о Java и Eclipse.

@ RawitasKrungkaew ответ - это хорошо.

Если вы не хотите использовать JSON, вы можете использовать рефлексию сметод расширения для повторного использования:

В некотором классе

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;
    }
  }
}

Так чтоповедение работает, даже если дизайн класса меняется.

Вы можете адаптировать метод для форматирования вывода по своему усмотрению, например:

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

Управление случаем повторного входа может бытьулучшено, потому что это может вызвать переполнение стека в формах, например.

0 голосов
/ 30 октября 2019

По умолчанию не существует способа сделать это - то, что вы видите в Eclipse, это тонкость Eclipse, а не встроенная функциональность среды выполнения. Вы можете написать расширение для VS самостоятельно (см. Мой комментарий) или использовать расширение, которое это делает. Я знаю, что R esharper предлагает услугу , но я должен подчеркнуть, что SO не является услугой "найди мне библиотеку, которая ...", поэтому я не предлагаю никаких рекомендаций или рекомендаций Re # ни в какихway

Также стоит отметить, что:

  1. Вы можете сделать это относительно легко в мощном текстовом редакторе
  2. Вы можете написать небольшое приложение, которое генерируетtostring при копировании класса в буфер обмена
  3. Вы можете отказаться от этого желания;в c # мы на самом деле не используем ToString () так широко, как java bods, потому что у нас был замечательный пошаговый отладчик, встроенный в IDE с момента его первого выпуска. Нам редко нужно структурировать наши объекты и выгружать их в командную строку для проверки состояния объектов программы в любой точке, потому что мы можем просто приостановить ее и увидеть в окне Locals и т. Д. Если вы не совсем в курсесо всем, что может сделать для вас отладчик, я рекомендую взглянуть на несколько видео
0 голосов
/ 30 октября 2019

Я не думаю, что Visual Studio имеет действие для выполнения такого рода генерации кода из коробки. Однако это можно сделать с помощью расширенного расширения Visual Studio: JetBrains Resharper.

У него есть действие для быстрой генерации ToString (наряду со многими, многими другими функциями).

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

0 голосов
/ 30 октября 2019

Вы можете сделать так:

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

или, может быть, лучшее решение:

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

Используйте приведение к свойству, если это необходимо.

...