C# 使用单个函数<;T、 布尔>;使用Where()和继承

C# 使用单个函数<;T、 布尔>;使用Where()和继承,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我试图使用单个Func定义来处理类及其继承器。这就是我所拥有的: Func<Job, bool> ValidJob = j => !j.Deleted && !j.OnHold && j.PostDate <= DateTime.Now && j.ExpireDate > DateTime.Now; public class JobExtended : Job { } Func ValidJob=

我试图使用单个
Func
定义来处理类及其继承器。这就是我所拥有的:

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

public class JobExtended : Job { }
Func ValidJob=
j=>!j、 删除&!j、 OnHold&&j.PostDate DateTime.Now;
公共类JobExtended:作业{}
因此,鉴于此,以下工作:

IQueryable<Job> jobs = ...
jobs.Where(ValidJob);
IQueryable作业=。。。
jobs.Where(ValidJob);
但是,以下情况并非如此:

IQueryable<JobExtended> jobs = ...
jobs.Where(ValidJob);
IQueryable作业=。。。
jobs.Where(ValidJob);
我想知道在这种情况下是否可能有一个
Func
,如果有,如何实现?我已经尝试按照建议指定类型参数,但运气不佳。

这将在C#4中起作用,在C#4中,委托具有通用协方差和逆变,但在此之前不行。但是,从C#2开始,您可以轻松地使用现有委托:

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

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

public static bool ValidJob<T>(T j) where T : Job
{
    return
        !j.Deleted && 
        !j.OnHold &&
        j.PostDate <= DateTime.Now &&
        j.ExpireDate > DateTime.Now;
}
公共静态bool ValidJob(tj)其中T:Job
{
返回
!j.已删除&&
!j.OnHold&&
j、 PostDate DateTime.Now;
}
那么,这些措施将起作用:

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

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