使用单个Func <t,bool>与Where()和继承</t,bool>

时间:2009-08-05 20:59:57

标签: c# .net linq lambda

我正在尝试使用单个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 个答案:

答案 0 :(得分:6)

这将适用于C#4,其中代表具有通用协方差和逆变,但在此之前不会。但是,您可以从C#2开始轻松使用现有委托:

jobs.Where(new Func<JobExtended, bool>(ValidJob));

答案 1 :(得分:3)

以下是解决方案的变体:在命名函数中使用泛型类型:

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);