2009-08-05 11 views
3

私はクラスとその継承を処理するために単一のFunc<T,bool>定義を使用しようとしています。これは私が持っているものです。Where()と継承で単一の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>を持っていれば、それはどうですか?私は提案された型引数を指定しようとしましたが、運がないです。

答えて

6

これはC#4で動作します。代理人は一般的な共分散と反差異を持っていますが、その前にはありません。ただし、以降のC#2から簡単に既存のデリゲートを使用することができます。

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

シンプルな...ありがとう! –

+0

ニース!それを知らなかった。 –

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

非常にいいです...これを追加していただきありがとうございます。 –

関連する問題