集合

2016-10-05 39 views
3

我有一個類似的問題this other post我有類集合

public class MyClass 
{ 
    // other properties 
    public bool IsDefault { get; internal set; } 
} 

和我有一樣

public class MyCollection : ICollection<MyClass> 
{ 
    private List<MyClass> _itemList = new List<MyClass>(); 

    public void SetAsDefault(MyClass item) 
    { 
     // Make sure no other items are default. 
     _itemList.ForEach(x => x.IsDefault = false); 

     // Set specified item as default. 
     _itemList.Find(x => x.Equals(item)).IsDefault = true; 
    } 
} 

我想定義的集合類中設置一個得到,只是一個對象屬性以確保只有MyCollection中的單個項目被標記爲默認值,同時能夠直接在MyClass上檢查是否有特定實例是默認值。標記設置爲MyClass.IsDefault的設置爲internal程序集外部的開發人員無法設置IsDefault。然而,就我而言,我想避免多次設置IsDefault屬性的開發人員可以訪問程序集內部,因此僅使用internal是不夠的。

有沒有聰明的解決方案來解決這個難題?我在這裏完全不知所措......

+1

改爲從ObservableCollection 派生,然後密封MyCollection。你會做一些工作,但大部分事情都在掌控之中。 –

+1

你可以創建一個靜態屬性'public static MyClass DefaultInstance;'並設置它。這將採取當前的默認實例。 –

+4

你強加一個相當弱的合約,只有一個項目實際上可以成爲默認項目。另外,一件物品可能是一件收藏品的默認品,而不是其他品種的可以設想的嗎?在這種情況下,將默認值存儲爲集合的屬性可能會更好嗎? – TheInnerLight

回答

1

我覺得這很難乾淨地正確。由於每個其他開發人員都可以在其他位置設置該屬性,因此我會嘗試將問題週轉。

您可以刪除Objects屬性並將其設置爲集合的屬性。由於某人可以檢索MyClass實例並進行設置,因此您可以向MyCollection添加一個方法來檢查MyClass實例是否爲該集合中的默認實例。

否則我沒有看到任何好方法來真正禁止你想要的東西。

+1

基於這個答案,以及對我的問題的很多好評,我會讓默認存儲在集合中。我原本希望能夠看到手頭的某個項目是否爲默認項目,如果只有一個「MyCollection」實例,這將起作用。但是,我不能排除將來會出現多個實例,這使得將項目中的屬性存儲爲無意義。如果將來我想在'MyCollection'的多個實例中維護一個通用的默認項目,我想我可以使屬性成爲靜態的。 –

1

如果你想獲取或設置實例,它是默認特定集合,你需要財產:

public MyClass Default { get; set; } 

MyCollection類中定義。

如果你想知道是否給定的MyClass實例默認爲特定集合,你需要方法:

public bool IsDefaultFor(MyCollection collection) { 
    return collection.Default == this; 
} 

如果您需要默認實例是集合的成員,在Default財產setter方法添加這樣的斷言和Remove方法。