(также включены жирафы, если они не соответствуют определенному условию исключения, которое имеет смысл только для жирафов)

аюсь придумать реализацию для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>();

Я думаю, что у этих двух вызовов есть серьезные недостатки. Первый страдает от избыточной конструкции типа / типа, а второй просто не имеет смысла (хочу ли я список животных, которые не являются ни животными, ни жирафами?).

Итак, есть ли способ выполнить то, что я хочу? Если нет, возможно ли это в будущих версиях языка? (Я думаю, что, возможно, однажды у нас будут именованные аргументы типа, или нам нужно только явно указать аргументы типа, которые не могут быть выведены?)

Или я просто глупый?

Ответы на вопрос(0)

Ваш ответ на вопрос