2009-08-05 7 views
3

J'essaie d'utiliser une seule définition Func<T,bool> pour gérer une classe et son héritier. Voilà ce que j'ai:En utilisant un seul Func <T,bool> avec Where() et l'héritage

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

public class JobExtended : Job { } 

Ainsi, étant donné que, les travaux suivants:

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

Cependant, les éléments suivants ne possède pas:

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

Je me demande s'il est possible avoir un seul Func<T,bool> dans cette situation et, si oui, comment? J'ai essayé de spécifier les arguments de type comme suggéré mais je n'ai pas de chance.

Répondre

6

Cela fonctionnera en C# 4, où les délégués ont une covariance et une contravariance génériques, mais pas avant. Cependant, vous pouvez utiliser le délégué existant facilement à partir de C# 2 et suivantes:

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

Si simple ... merci! –

+0

Nice! Je ne le savais pas. –

3

Voici une variante de la solution: utiliser un type générique dans une fonction nommée:

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

Ensuite, ces travailleraient:

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

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

Très gentil ... merci d'ajouter ceci. –

Questions connexes