2009-08-28 103 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>。所以你可以看到它不是一个限制。