2009-06-12 12 views
0

私のプロジェクトを.NET 3.5にアップグレードしたばかりで、LINQには完全な使い方があると思いました。私のアプリケーションには、実行時に開いているウィンドウを追跡するウィンドウマネージャがあり、FindOpenWindowsジェネリックメソッドを追加しようとしています。これまでに行ったこと:ジェネリック条件付きLINQ

List<Form> openWindows; 

    public List<T> FindOpenWindows<T>(Predicate<T> constraint) 
    { 
     var foundTs = from form in openWindows 
          where constraint(form) 
           && form.Created 
          select form; 

     return foundTs as List<T>; 
    } 

しかし、私は "Delegate System.Predicateに無効な引数がいくつかあります。"呼び出し側は、彼らが探しているウィンドウの正確種類の一覧を取得するように、私は、関数は非ジェネリックしなかった理由がある

public List<T> FindOpenWindows<T>(Predicate<Form> constraint) 
    { 
     var foundTs = from form in openWindows 
          where constraint(form as Form) 
           && form.Created 
          select form; 

     return foundTs as List<T>; 
    } 

:だから私は、のような方法を書き直しました。

LINQおよびラムダ式が新しくなったので、FindOpenWindowsの呼び出しで述語のコードを書く方法を正確にはわかりません。私は明らかに、渡されているFormがnullではないことを確認できる必要があり、探している型と一致するかどうかを確認する必要があります。

答えて

2
public List<T> FindOpenWindows<T>(Predicate<T> constraint) 
    where T : Form 
{ 
    var foundTs = from form in openWindows 
         where constraint(form) 
          && form.Created 
         select form; 

    return foundTs.ToList(); 
} 

これを試してください。 TをForm型にするように制約する必要があります。

+0

ありがとう、それは完璧に動作します!私は呼び出す必要があることがわかりました: リスト mainWindows = Program.windowManager.FindOpenWindows ((フォームf)=> fはfrmMainです); – jasonh