2009-08-28 104 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。

編輯

理想的情況下,想只保留方法通用,而不是類。如果不可能,請讓我知道..

回答

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' – 2009-08-28 21:06:57

+1

@B Z:只能使該方法是通用的,但它必須保持泛型直到被調用。您不能從非泛型類派生出來,並在您嘗試的問題中指定方法的泛型類型。在這種情況下,調用者將不得不爲該方法提供類型。 – 2009-08-28 21:24:07

+0

@Mark - thx。似乎是對我的限制?你知道那裏是否有進一步的解釋?也許在Jon Skeet的C#深入? – 2009-08-28 21:40:14

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。特別是,下面的必須工作,因爲ProjectFilterFilterBase派生:

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

所以FilterBase不能只實現GetFilter<Linq.Project>。它需要實現GetFilter<string>,GetFilter<int>等;總之,GetFilter<T>。所以你可以看到它不是一個限制。