2010-07-25 64 views
2

我想設置一個類,以便可以使用對象初始值設定項初始化它,但它包含一些集合。理想情況下,我想客戶端代碼能夠做到:C#對象初始值設定項和集合

MyClass myObj = new MyClass 
{ 
    Name = "Name", 
    Contents = new[] 
    { 
    "Item1", 
    "Item2" 
    } 
} 

然而,在Contents需要一個BindingList<string>。底層字段存儲對該列表的只讀引用,並且我希望制定者基本上執行Clear,然後AddRange來設置內容。

我不能讓Contents財產IEnumerable<string>,因爲客戶端代碼將不會看到Add方法,等等,至少在沒有第一投射它。我不能使它成爲BindingList<string>,因爲如果我設置它,我需要構建一個新的綁定列表來傳遞給它..這可能是可能的,但我寧願不介紹構造一個新的BindingList<string>專爲此目的的低效率把它傳遞給財產製定者。

能夠做的理想事情是讓getter返回BindingList<string>,setter接受IEnumerable<string>,但C#不允許屬性上的getter/setter具有不同的類型。

呵呵,隱含在鑄造BindingList<string>IEnumerable<string>之間是一個禁忌,所以我不能那麼做(http://blogs.msdn.com/b/peterhal/archive/2005/06/20/430929.aspx)。

有沒有辦法解決這個問題?

回答

2

C#初始化語法會自動調用你的財產的徵收對象上Add方法。當然,事先不會調用Reset(),但該對象在那一點上仍然是空的,所以沒關係。

替換列表是否必須使用屬性集語法?讓setter替換集合的內容而不實際更改集合對象的身份是非常出乎意料的,並且可能會導致錯誤。

1

創建從BindingList<string>派生的自定義集合類和類型添加隱式轉換string[]

0

我會推薦封裝BindingList。在這種情況下,回到舊派創建對象的方式,以免造成不必要的耦合。在語言慣例上贊成良好的面向對象。

相關問題