泛型混淆了IBindingList和BindingList <t> </t>

时间:2013-03-22 22:08:08

标签: c# generics casting

我正在开发一个基本上是现场直播的小型图书馆。我应该可以做这样的事情:

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>

1 个答案:

答案 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 */
}