3

私は基本的にライブlinqである小さなライブラリに取り組んでいます。私は次のようなことができるはずです:

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取り、toIBindingListからどこにでもキャストを追加することを余儀なくされ、また、複数の を連結すると、コンパイラが使用法から型を推測できなくなり、コードが次のようになる必要があります。objectTResultLiveSelect

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>

4

1 に答える 1

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 */
}
于 2013-04-08T15:04:17.577 に答える