2009-02-16 40 views
1

當您有一個包含項目列表的對象時,如何管理這個簡單場景。 EG:便利性或「懶惰編程」IList管理 - 保護IList.Add方法

public class ContainerObject 
{ 
    IList<ChildObject> Children { get; } 

    public void AddCustom(ChildObject toAdd) 
    { 
     // Some validation ... 
     Children.Add(toAdd); 
    } 
} 

假設集合初始化爲IList中的實現,有沒有辦法在其中控制對象被添加到列表的方式嗎?

例如,我有一個ContainerObject類的另一個方法,它接受一個ChildObject並將其添加到列表中。在添加它之前,需要此方法對ChildObject執行一些基本驗證。

我很懶,因爲我不想搞亂並編寫一個消費開發者需要實現的自定義列表接口(沒有添加方法)。我也在IQueryable接口上使用ToList()方法,所以這是堅持使用IList的另一個原因 - 它只是起作用。

那麼,有沒有一種方法可以監控如何將項目添加到IList實例,即阻止使用Add方法,並且只允許通過我的自定義方法添加到集合中,或者我只是要求不可能? ...和懶惰:(

我能想到的,其中檢查項目時,通過我的自定義方法或直接在列表上添加但這些似乎哈克幾個哈克方法!

任何人都遇到類似的事情如果是這樣,你做了什麼?

回答

5

你可以讓你的財產返回一個包裝原始列表使用ReadOnlyCollection<T>。這將確保調用者不會自己添加任何項目。原始的可變列表請注意,因爲只讀集合只是一個包裝器,所以緩存只讀集合的​​調用者仍然會看到您對原始列表添加的內容。取決於您的預期用途,不是一件好事。

編輯:解釋我的緩存評論...

假設一個客戶做的:

IList<ChildObject> originalChildren = container.Children;  
container.AddChild(new ChildObject()); 
IList<ChildObject> updatedChildren = container.Children;  

Children財產這樣實現的:

private IList<ChildObject> children = new List<ChildObject>(); 
public IList<ChildObject> Children 
{ 
    get { return new ReadOnlyCollection<ChildObject>(children); } 
} 

然後originalChildrenupdateChildren會兩者都有相同的內容 - 返回的ReadOnlyCollection不會是快照第一行收集的孩子。這只是一個圍繞集合的包裝。客戶將無法依靠它而改變 - 他們無法自己改變它。

+0

對不起喬恩,你能否更詳細地解釋緩存評論?謝謝 – 2009-02-16 19:03:48