我正在研究一個基本上是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
並被迫到處添加石膏從object
到TResult
,也使編譯器無法當我串聯多個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);
其中list
是BindingList<int>
?
爲什麼決定不從BindingLit獲得ReadingBindingList ?看來這個決定是背後的難題。 –
2013-03-22 22:42:27
因爲這會使列表不爲只讀。現在,所有的寫入操作都會拋出異常。實際名稱是「ReadOnlyBindingList」。 – Juan 2013-03-22 22:47:13
因此重寫拋出異常的方法。這比重寫整個班級的工作要少得多。 – 2013-03-22 22:48:39