ワイルドカードが欲しい

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


追記:
ワイルドカードに関しては、そんなに簡単な問題でもないようで、やはりインターフェイスを分ける方法の方がいいのかな。