NotOfType
読み取り可能な呼び出し構文を持つの実装を考え出そうとしています。NotOfType
を補完する必要があり、その結果、タイプではないOfType<T>
すべての要素が生成されますT
OfType<T>
私の目標は、このスニペットの最後の行のように、のように呼び出されるメソッドを実装することでした。
public abstract class Animal {}
public class Monkey : Animal {}
public class Giraffe : Animal {}
public class Lion : Animal {}
var monkey = new Monkey();
var giraffe = new Giraffe();
var lion = new Lion();
IEnumerable<Animal> animals = new Animal[] { monkey, giraffe, lion };
IEnumerable<Animal> fewerAnimals = animals.NotOfType<Giraffe>();
ただし、その特定の呼び出し構文をサポートする実装を思い付くことができません。
これは私がこれまでに試したことです:
public static class EnumerableExtensions
{
public static IEnumerable<T> NotOfType<T>(this IEnumerable<T> sequence, Type type)
{
return sequence.Where(x => x.GetType() != type);
}
public static IEnumerable<T> NotOfType<T, TExclude>(this IEnumerable<T> sequence)
{
return sequence.Where(x => !(x is TExclude));
}
}
これらのメソッドの呼び出しは次のようになります。
// Animal is inferred
IEnumerable<Animal> fewerAnimals = animals.NotOfType(typeof(Giraffe));
と
// Not all types could be inferred, so I have to state all types explicitly
IEnumerable<Animal> fewerAnimals = animals.NotOfType<Animal, Giraffe>();
これらの両方の呼び出しのスタイルには大きな欠点があると思います。最初のものは冗長な「タイプ/タイプの」構造に悩まされており、2番目のものはまったく意味がありません(動物でもキリンでもない動物のリストが必要ですか?)。
それで、私が望むことを達成する方法はありますか?そうでない場合、言語の将来のバージョンで可能でしょうか?(いつの日か、型引数に名前を付けるか、推論できない型引数を明示的に指定するだけでよいと思いますか?)
それとも私はばかげているだけですか?