2015-11-12 56 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就個人而言,如果可能的話,我總是會採用構造函數注入而不是屬性注入。如果你使用一個財產,當然你仍然需要通過它一路? –