ワイルドカードが欲しい
ICollectionはジェネリックなので、
delegate bool IsExpected<T>(T target); static bool AnyImpl<T>(IsExpected<T> isExpected, params T[] targets) { foreach (T target in targets) { if (isExpected(target)) return true; } return false; } public static bool AnyEmpty<T>(params ICollection<T>[] targets) { return AnyImpl(delegate(ICollection<T> target) { return target.Count == 0; }, targets); }
こう書いたとき、AnyEmptyの引数として同一の型(T)を格納したコレクションしか渡せないことになる。
AnyEmptyメソッド内でTなんて使ってないのに!
JavaのようにワイルドカードがあればICollection<?>とすればいいだけなのに・・・
それか、ICollectionTraits的な非ジェネリックのインターフェイスを用意して、そこにプロパティを移して、ICollectionはICollectionTraitsから継承するようにするか。
ジェネリックに関係のないプロパティ、メソッド等は非ジェネリックなインターフェイスに記述し、ジェネリックに関係のあるもののみジェネリックなインターフェイスに記述する、か。
またインターフェイスが増えていくw
追記:
ワイルドカードに関しては、そんなに簡単な問題でもないようで、やはりインターフェイスを分ける方法の方がいいのかな。