C# 泛型与IBindingList和BindingList混淆<;T>;
我在一个小图书馆工作,它基本上是一个活的linq。我应该可以做这样的事情:C# 泛型与IBindingList和BindingList混淆<;T>;,c#,generics,casting,C#,Generics,Casting,我在一个小图书馆工作,它基本上是一个活的linq。我应该可以做这样的事情: var list1 = new BindingList<int>(); ReadOnlyBindingList<int> live = list1.LiveSelect(i => i + 1); var live = list.LiveSelect(i => i + 1).LiveSelect<int, int>(i => i + 1); var live = l
var list1 = new BindingList<int>();
ReadOnlyBindingList<int> live = list1.LiveSelect(i => i + 1);
var live = list.LiveSelect(i => i + 1).LiveSelect<int, int>(i => i + 1);
var live = list.LiveSelect(i => i + 1).LiveSelect(i => i + 1);
但为了做到这一点,我的LiveSelect
需要获取一个ReadOnlyBindingList
,这将迫使我添加一个扩展方法AsReadOnly
,该扩展方法将获取一个BindingList
,并将其包装到继承自ReadOnlyBindingList
的类中,因此我的代码如下所示:
ReadOnlyBindingList<int> live = list1.AsReadOnly().Select(i => i + 1).Select(i => i * i);
有没有办法让我的代码看起来像这样:
var list1 = new BindingList<int>();
ReadOnlyBindingList<int> live = list1.LiveSelect(i => i + 1);
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
?为什么不在ReadOnlyBindingList中添加一个LiveSelect,在内部进行强制转换或必要的转换
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 */
}
var live=list.LiveSelect(i=>i+1)/*返回一个readonlybindinglist*/.LiveSelect(i=>i+1)/*这是bindinglist中的方法*/
公共只读绑定列表LiveSelect(Func lambda){
return/*调用不执行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 */
}
public static ReadOnlyBindingList LiveSelect(此BindingList源代码,Func lamda){
返回/*强制转换到readonlybindinglist并调用不执行liveselect的静态方法*/
}
为什么决定不从BindingLit派生ReadingBindingList?看来这个决定是你困难的背后原因,因为这会使列表成为非只读的。现在,所有写操作都会引发异常。实际名称是ReadOnlyBindingList
。因此重写方法以引发异常。这比重写整个类要省力。我认为它们不是虚拟的,是吗?ClearItems()是。没有检查其他人。