2009-08-05 7 views
3

Ich versuche, eine einzige Func<T,bool>-Definition verwenden, um eine Klasse und seinen Nachfolger zu behandeln. Das ist, was ich habe:Mit einem einzigen Func mit Where() und Vererbung

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

public class JobExtended : Job { } 

So, da die folgenden Werke:

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

jedoch folgendes nicht:

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

Ich frage mich, ob es möglich ist eine einzige Func<T,bool> in dieser Situation zu haben, und wenn ja, wie? Ich habe versucht, die Typargumente wie vorgeschlagen zu spezifizieren, habe aber kein Glück.

Antwort

6

Dies funktioniert in C# 4, wo Delegierte generische Kovarianz und Kontravarianz haben, aber nicht davor. Sie können jedoch die Delegierten leicht von C# 2 ab verwenden:

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

So einfach ... danke! –

+0

Schön! Wusste das nicht. –

3

Hier ist eine Variante der Lösung: eine generische Art in einer benannten Funktion:

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

Dann würde diese Arbeit:

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

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

Sehr schön ... danke für das Hinzufügen. –

Verwandte Themen