我正在开发一个基本上是现场直播的小型图书馆。我应该可以做这样的事情:
var list1 = new BindingList<int>();
ReadOnlyBindingList<int> live = list1.LiveSelect(i => i + 1);
这里,ReadOnlyBindingList
是我编写的通用抽象类,它实现IBindingList
但不继承BindingList<T>
。 LiveSelect
方法采用BindingList<T>
列表并返回实现ReadOnlyBindingList<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>
?
答案 0 :(得分:0)
为什么不将LiveSelect添加到ReadOnlyBindingList中,以便在内部进行强制转换或所需的转换?
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 */
}