LINQ с общим ограничением предиката - PullRequest
0 голосов
/ 12 июня 2009

Я только что обновил свой проект до .NET 3.5 и подумал, что отлично использую LINQ. В моем приложении есть менеджер окон, который отслеживает открытые окна во время выполнения, и я пытаюсь добавить универсальный метод FindOpenWindows. Что я сделал до сих пор:

    List<Form> openWindows;

    public List<T> FindOpenWindows<T>(Predicate<T> constraint)
    {
        var foundTs = from form in openWindows
                          where constraint(form)
                                && form.Created
                          select form;

        return foundTs as List<T>;
    }

Но я получаю «Делегат System.Predicate имеет несколько недопустимых аргументов». Поэтому я переписал метод как:

    public List<T> FindOpenWindows<T>(Predicate<Form> constraint)
    {
        var foundTs = from form in openWindows
                          where constraint(form as Form)
                                && form.Created
                          select form;

        return foundTs as List<T>;
    }

Причина, по которой я не сделал функцию неуниверсальной, заключается в том, что вызывающая сторона получает список точно того типа окна, которое они ищут.

Поскольку я новичок в выражениях LINQ и Lambda, я не уверен, как именно написать код для предиката при вызове FindOpenWindows. Очевидно, мне нужно убедиться, что передаваемая форма не является нулевой, и мне нужно иметь возможность проверить, соответствует ли она искомому типу.

1 Ответ

2 голосов
/ 12 июня 2009
public List<T> FindOpenWindows<T>(Predicate<T> constraint)
   where T : Form
{
    var foundTs = from form in openWindows
                      where constraint(form)
                            && form.Created
                      select form;

    return foundTs.ToList();
}

Попробуй это. Вам нужно ограничить тип T типом.

...