2013-03-22 40 views
3

我正在研究一個基本上是live linq的小型庫。我應該可以做的東西是這樣的:泛型與IBindingList和BindingList混在一起<T>

var list1 = new BindingList<int>(); 
ReadOnlyBindingList<int> live = list1.LiveSelect(i => i + 1); 

這裏,ReadOnlyBindingList是一個通用的抽象類,我寫了一個實現IBindingList但不繼承BindingList<T>LiveSelect方法採用BindingList<T>列表並返回實現抽象類的類。現在,我希望能夠做到:

ReadOnlyBindingList<int> live = list1.LiveSelect(i => i + 1).LiveSelect(i => i * i); 

但爲了做到這一點,我LiveSelect需要任取一個ReadOnlyBindingList<T>,這將迫使我添加一個擴展方法AsReadOnly,將採取一個BindingList<T>和包裝成從ReadOnlyBindingList<T>繼承,一個類,所以我的代碼看起來像:

ReadOnlyBindingList<int> live = list1.AsReadOnly().Select(i => i + 1).Select(i => i * i); 

還是有LiveSelect採取IBindingList並被迫到處添加石膏從objectTResult,也使編譯器無法當我串聯多個LiveSelect推斷從使用的類型,例如我的代碼需要看起來像這樣:

var live = list.LiveSelect(i => i + 1).LiveSelect<int, int>(i => i + 1); 

有沒有什麼辦法可以讓我的代碼如下所示:

var live = list.LiveSelect(i => i + 1).LiveSelect(i => i + 1); 

其中listBindingList<int>

+0

爲什麼決定不從BindingLit 獲得ReadingBindingList ?看來這個決定是背後的難題。 – 2013-03-22 22:42:27

+0

因爲這會使列表不爲只讀。現在,所有的寫入操作都會拋出異常。實際名稱是「ReadOnlyBindingList」。 – Juan 2013-03-22 22:47:13

+0

因此重寫拋出異常的方法。這比重寫整個班級的工作要少得多。 – 2013-03-22 22:48:39

回答

0

爲什麼不在你的ReadOnlyBindingList中添加一個LiveSelect來使內部轉換或需要的轉換?

var live = list.LiveSelect(i=> i+1)/*this returns a readonlybindinglist*/.LiveSelect(i=> i+1)/*this is the method in bindinglist*/ 

public ReadOnlyBindingList<T> LiveSelect(Func<T,T> lambda){ 
    return /* call static method that does liveselect */ 
} 

,這是擴展

public static ReadOnlyBindingList<T> LiveSelect(this BindingList<T> source, Func<T,T> lamda){ 
    return /*cast to readonlybindinglist and call static method that does liveselect */ 
}