这是一个常见的重构,我不相信我已经看到了一个捷径:
想象一下,我们有一个带有许多继承子类的基类。基类使用构造函数注入来接受许多服务:
class FooBase
{
private IMyService _myService;
private IMyOtherService _myOtherService;
public FooBase(IMyService myService, IMyOtherService _myOtherService)
{
_myService = myService;
_myOtherService = myOtherService;
}
}
class FooConcrete : FooBase
{
public FooConcrete(IMyService myService, IMyOtherService _myOtherService)
base(myService, myOtherService)
{
}
}
注意FooConcrete如何调用其基类FooBase的构造函数。
现在,如果我想向FooBase添加其他服务会怎样?我可以从FooBase的构造函数快速初始化新的私有字段。但我仍然需要四处手动更新从FooBase继承的每个子类。如果有很多继承类,这可能会很麻烦。
是否有快捷方式或者我可以使用的技巧来快速更新所有子类的构造函数?
答案 0 :(得分:1)
构建,然后修复编译错误。
ReSharper没有这方面的工具,包括今天推出的ReSharper 6中的AFAIK。
答案 1 :(得分:1)
我知道的最佳方法是通过 更改签名 ( Ctrl + R,S 向FooBase
构造函数添加新的服务参数>)使用适当的参数名称作为默认值,例如yetAnotherService
。
之后,您在所有子类构造函数中的base
调用中确实存在错误。但是你可以通过3个击键来解决每个错误:
- 通过 Alt + Shift + Page Down 转到错误,
- 通过 Alt + Enter 打开上下文菜单,
- 通过 输入 选择第一个选项(在包含构造函数中创建参数'yetAnotherService')。
好的,你还有很多击键。但这是最快的方式(使用ReSharper 5.1.3),我知道。
答案 2 :(得分:1)
自从我问了这个问题以来,Resharper现在已经将支持作为Change Signature功能的一部分。
例如,要将参数添加到基类的构造函数中,请使用以下方法:
右键单击要更改的构造函数,选择Refactor-> Change Signature。
进行所需的更改,然后单击“下一步”。选择“使用调用树解决”,然后单击“下一步”。
将进行更改,并且将在Visual Studio中的某个位置打开一个窗口,标题为“重构-更改签名”。继承类的列表将显示在此窗口中。
双击每个类,然后选择“在构造函数y中创建参数x”
答案 3 :(得分:0)
如果你知道构造函数可以在生命周期内改变,你可以创建一个参数类,如:
class FooInfo
{
IMyService MyService {get; set;}
IMyOtherService MyOtherService {get; set;}
}
并且可以将这样的对象传递给构造函数,即:
class FooBase
{
private FooInfo _fooInfo;
public FooBase(FooInfo fooInfo)
{
_fooInfo= fooInfo;
}
}
class FooConcrete : FooBase
{
public FooConcrete(FooInfo fooInfo)
base(fooInfo)
{
}
}
然后,如果您需要一个新参数,只需将其添加到FooInfo
类。不需要更改子类。
ReSharper有一个重构,用于从构造函数参数生成这样的参数类:
将光标放在代码文件中的构造函数名称和
按 Ctrl + Shift + R 和
选择 从参数中提取类... 。