Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型与IBindingList和BindingList混淆<;T>;_C#_Generics_Casting - Fatal编程技术网

C# 泛型与IBindingList和BindingList混淆<;T>;

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

我在一个小图书馆工作,它基本上是一个活的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 = 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()是。没有检查其他人。