Я пытаюсь придумать реализацию для 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>();
Я думаю, что есть серьезные недостатки в стиле обоих этих вызовов. Первая из них имеет избыточную конструкцию типа/типа, а вторая просто не имеет смысла (хочу ли я список животных, которые не являются ни Животные, ни Жирафы?).
Итак, есть ли способ выполнить то, что я хочу? Если нет, возможно ли это в будущих версиях языка? (Я думаю, что, возможно, однажды мы будем иметь аргументы типа типа или нам нужно явно указывать аргументы типа, которые нельзя вывести?)
Или я просто глуп?