C#将构造函数参数绑定到实例变量

Jan*_*Jan 8 c# constructor

非常常见的情况:我有一个包含多个实例变量的类和一个接受多个参数的构造函数.我能以某种方式将一个绑定到另一个吗?将所有参数分配给实例变量非常冗长,并且是配置约定原则可以(并且应该)涵盖的情况之一.我的示例代码如下所示:

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#自动完成它的魔力?

Jon*_*eet 5

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中使用的方法.)


And*_*tan 2

虽然有很多插件可以做这种事情 - 值得注意的是,如果您 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)

  • +1:您还可以使用 `ctrl` + `.` 访问相同的菜单(至少在 VS2010 Express 中)。 (2认同)