Использование единственного Func <T, bool> с Where () и наследованием - PullRequest
3 голосов
/ 06 августа 2009

Я пытаюсь использовать одно определение Func<T,bool> для обработки класса и его наследника. Вот что у меня есть:

Func<Job, bool> ValidJob =
        j => !j.Deleted && !j.OnHold && j.PostDate <= DateTime.Now && j.ExpireDate > DateTime.Now;

public class JobExtended : Job { }

Итак, учитывая, что следующие работы:

IQueryable<Job> jobs = ...
jobs.Where(ValidJob);

Тем не менее, следующее:

IQueryable<JobExtended> jobs = ...
jobs.Where(ValidJob);

Мне интересно, возможно ли в этой ситуации иметь один Func<T,bool>, и если да, то как? Я попытался указать аргументы типа, как это было предложено, но мне не повезло.

Ответы [ 2 ]

6 голосов
/ 06 августа 2009

Это будет работать в C # 4, где делегаты имеют общую ковариацию и контравариацию, но не раньше Однако вы можете легко использовать существующий делегат начиная с C # 2:

jobs.Where(new Func<JobExtended, bool>(ValidJob));
3 голосов
/ 06 августа 2009

Вот вариант решения: используйте универсальный тип в именованной функции:

public static bool ValidJob<T>(T j) where T : Job
{
    return
        !j.Deleted && 
        !j.OnHold &&
        j.PostDate <= DateTime.Now &&
        j.ExpireDate > DateTime.Now;
}

Тогда это будет работать:

IQueryable<Job> jobs = ...
jobs.Where(ValidJob);

IQueryable<JobExtended> jobs = ...
jobs.Where(ValidJob);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...