非常常见的情况:我有一个包含多个实例变量的类和一个接受多个参数的构造函数.我能以某种方式将一个绑定到另一个吗?将所有参数分配给实例变量非常冗长,并且是配置约定原则可以(并且应该)涵盖的情况之一.我的示例代码如下所示:
public class myClass
{
private object param1;
private object param2;
private object param3;
private object param4;
public myClass(object param1, object param2, object param3, object param4)
{
this.param1 = param1;
this.param2 = param2;
this.param3 = param3;
this.param4 = param4;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以摆脱这种情况并让C#自动完成它的魔力?
C#语言中没有任何内容可以涵盖这一点,没有.虽然工具可以为您生成代码,但它们可能不一定会保持最新状态,您仍然可以使代码存在且可见.你可以潜在地利用反射,如这样做在某些情况下:
public MyClass(object param1, object param2, object param3, object param4)
{
Helpers.PopulateFromConstructor(this, param1, param2, param3, param4);
}
Run Code Online (Sandbox Code Playgroud)
...您需要以与参数相同的顺序指定值,并保持名称与字段等相同.您可能还会发现字段存在问题readonly.
就个人而言,我只是吮吸它 - 如果你愿意,可以使用工具来生成代码,但除此之外只需要使用它.
请注意,您可能希望在设置字段时进行验证,尤其是在无效范围内.所以你的构造函数体实际上最终会像这样结束:
public myClass(object param1, object param2, object param3, object param4)
{
this.param1 = Preconditions.CheckNotNull(param1);
this.param2 = param2;
this.param3 = Preconditions.CheckNotNull(param3);
this.param4 = param4;
}
Run Code Online (Sandbox Code Playgroud)
(Preconditions当然,对于一个合适的类.我在Java代码中无意中从Guava中剔除了这个想法,因为我在日常编码中使用它.这也是我们在Noda Time中使用的方法.)
虽然有很多插件可以做这种事情 - 值得注意的是,如果您 VS2010+ 具有在不存在匹配构造函数时从模型调用生成构造函数的本机功能,那么您可以使用简单的键盘快捷键来为您完成这项工作。
即如果我是一个存根类:
class MyClass{
}
Run Code Online (Sandbox Code Playgroud)
然后在某个方法中我写了这样的东西:
object p1, p2, p3;
//... (get values for p1-3)
var a = new MyClass(p1, p2, p3);
Run Code Online (Sandbox Code Playgroud)
当这样的构造函数不存在时,会出现一个小帮助按钮。如果您单击该按钮,或按ALT+SHIFT+F10(默认情况下),您会看到一个菜单,其中的选项之一是生成存根构造函数,然后它将更改代码,MyClass如下所示:
class MyClass
{
private object p1;
private object p2;
private object p3;
public MyClass(object p1, object p2, object p3)
{
// TODO: Complete member initialization
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
}
Run Code Online (Sandbox Code Playgroud)