Могу ли я реорганизовать конструктор класса для использования нового класса, используя Visual Studio? - PullRequest
0 голосов
/ 08 марта 2012

У меня есть следующий класс, в конструкторе которого слишком много параметров, и я хочу реорганизовать класс, чтобы получить только один объект, который инкапсулирует все параметры.

public class MyClass
{
    public MyClass(
       string param1,
       string param2,
       string param3,
       string param4,
       string param5)
    {
       ...
    }
}

Можно ли использовать утилиту рефакторинга Visual Studio для инкапсуляции всех параметров конструктора в новый класс?

public class MyClass
{
    public MyClass(MyClassParameters parameters)
    {
       ...
    }
}

public class MyClassParameters
{
    public string Param1 { get; set; }
    public string Param2 { get; set; }
    public string Param3 { get; set; }
    public string Param4 { get; set; }
    public string Param5 { get; set; }
}

Так что мои вопросы

  • Могу ли я сделать это с помощью Visual Studio, чтобы мне не пришлось вручную обновлять все ссылки на класс MyClass?
  • Существуют ли другие инструменты рефакторинга, поддерживающие эту функцию, такие как Resharper или другие?

Это тяжелая работа, поскольку у меня есть тысячи ссылок на этот класс в моем модульном тестировании.

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

Встроенный параметр C # рефакторинг не включает «вводить параметр объекта» рефакторинг.

Resharper и Refactor Pro (оба коммерческих) есть.

3 голосов
/ 08 марта 2012

У вас есть ReSharper ?
С помощью ReSharper вы устанавливаете курсор на конструктор, нажимаете Ctrl + R , Ctrl + R и выбираете Извлечение класса из параметров ... .

0 голосов
/ 08 марта 2012

Если класс уже используется повсеместно, вы можете просто создать другой конструктор, принимающий параметр MyParameter, скопировать старую функциональность (обновив ссылки на каждый параметр в свойствах / полях MyParameter) и просто прочитайте старый конструктор:

public MyClass(
   string param1,
   string param2,
   string param3,
   string param4,
   string param5) : this(new MyParameter(param1, param2...))
{
}

Не самое симпатичное решение, но, как упоминает Одед, «встроенного» способа изменения параметров конструктора не существует.

...