Я только что обновил свой проект до .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. Очевидно, мне нужно убедиться, что передаваемая форма не является нулевой, и мне нужно иметь возможность проверить, соответствует ли она искомому типу.