2015-11-12 55 views
0

考虑下面的代码:在C#中,是否有办法强制一些属性在对象初始化器中初始化?

public class ClassA 
{ 
    public int PropertyA { get; set; } 
    public int PropertyB { get; set; } 
} 

// Somewhere else 
var obj = new ClassA 
{ 
    PropertyA = 1, 
    // Question: 
    // How do we force PropertyB to be set here without making it a parameter in the constructor? 
    // Ideally in compile time so that the code here would cause a compile error. 
}; 

动机:这个问题向我走来时,我试图通过属性,而不是在构造函数中注入依赖。

+6

使它成为构造函数的一部分,你不能用对象初始值设定项来做到这一点(据我所知)。 – Hristo

+0

@Chris:这是我试图避免的。当我们想添加新的依赖关系时,通过构造函数注入依赖关系会导致很多问题。我们必须沿着依赖关系链向每个构造函数添加一个新参数。 –

+0

所以你想防止[时间耦合](http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/),但没有原子初始化?哈哈哈......那是不可能的。 – Steven

回答

3

也许你没有意识到这一点,但你可以将一个对象初始化程序和一个构造函数结合起来。

所以,你可以强制初始化在构造函数中,并仍然允许一个对象初始化器,像这样:

public class ClassA 
{ 
    public ClassA(int propertyB) 
    { 
     PropertyB = propertyB; 
    } 

    public int PropertyA { get; set; } 
    public int PropertyB { get; set; } 
} 

因此:

var obj = new ClassA(2 /*Property B*/) 
{ 
    PropertyA = 1 
}; 

然而,在回答你的问题:不,你可以” t强制在对象初始化器中初始化属性。

+0

这就是我试图避免的。当我们想添加新的依赖关系时,通过构造函数注入依赖关系会导致很多问题。我们必须沿着依赖关系链向每个构造函数添加一个新参数。 –

+0

@ChrisXue就个人而言,如果可能的话,我总是会采用构造函数注入而不是属性注入。如果你使用一个财产,当然你仍然需要通过它一路? –