泛型与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,并被迫在从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> ?

泛型与IBindingList和BindingList<T>混淆

为什么不添加一个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 */
}