泛型与IBindingList和BindingList混淆
本文关键字:混淆 BindingList IBindingList 泛型 | 更新日期: 2023-09-27 18:05:28
我正在开发一个小型库,它基本上是一个实时链接。我应该能够做这样的事情:
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>
?
为什么不添加一个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 */
}