2009-08-28 17 views
6

C#、.net 3.5C#抽象汎用メソッド

汎用メソッドを持つ基本クラスを作成しようとしています。クラスを継承するクラスは、メソッドの型を指定する必要があります。

これは、フィルタリングを管理するクラスを作成するための前提です。

だから私はしている:

public abstract class FilterBase { 
    //NEED Help Declaring the Generic method for GetFilter 
    //public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 

public class ProjectFilter:FilterBase { 
    public IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query) { 
    //do stuff with query 
    return query; 
    } 
} 

public class ProjectList { 
    public static ProjectList GetList(ProjectFilter filter) { 
    var query = //....Linq code... 

    query = filterCriteria.GetFilter(query); 

    } 

} 

は、それは単純なものであると思うが、私はされるgetFilter抽象メソッドにFilterBaseの構文の権利を取得することはできません。

EDIT

理想的には、クラスジェネリックとないものとして唯一の方法を維持したいと思います。可能でない場合は、私に教えてください。

答えて

15

FilterBaseクラス自体を汎用的にします。

public abstract class FilterBase<T> 
{ 
    public abstract IQueryable<T> GetFilter(IQueryable<T> query); 
} 

これは、このようなあなたのProjectFilterクラスを作成することを可能にする:もちろん

public class ProjectFilter : FilterBase<Linq.Project> 
{ 
    public override IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query) 
    { 
     //do stuff with query 
     return query; 
    } 
} 
+0

が動作しますが、クラスを汎用化する必要がありますか?メソッドを汎用的に保つことはできませんか?なぜなら、同じクラスに対して複数のGetFilterが存在する可能性があるからです。別のIQueryableを取るのは、 'Linq.Project'以外のです。 –

+1

@B Z:メソッドを汎用にすることはできますが、呼び出されるまで汎用でなければなりません。非ジェネリッククラスから派生させることはできませんし、あなたの質問にしようとするとメソッドのジェネリック型を割り当てることはできません。その場合、呼び出し元はメソッドに型を指定する必要があります。 –

+0

@Mark - thx。私には限界があるようですね?そこに詳しい説明があるかどうか知っていますか?多分、ジョン・スケートのC#で深さ? –

4
public abstract class FilterBase<T> { 
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 
2

、あなたは抽象的、一般的な方法で持つことができます。

public abstract class FilterBase { 
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 

を問題がありますそれはあなたが望むものを意味するものではありません。任意のTを呼び出すことができます。

FilterBase fb = new ProjectFilter(...); 
IQueryable<string> query = ...; 
IQueryable<string> filter = fb.GetFilter<string>(query); 

のでFilterBaseがちょうどGetFilter<Linq.Project>を実装することはできません。ProjectFilterFilterBaseから派生するので、特に、以下は、働かなければなりません。 GetFilter<string>GetFilter<int>などを実装する必要があります。要するに、GetFilter<T>。だからあなたはそれが限界ではないことを見ることができます。

関連する問題