C#抽象泛型方法

C#抽象泛型方法,c#,linq,generics,C#,Linq,Generics,C#,.net 3.5 我试图创建一个具有泛型方法的基类。从它继承的类应该指定方法的类型 这样做的前提是创建管理筛选的类 因此,我: public abstract class FilterBase { //NEED Help Declaring the Generic method for GetFilter //public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query);

C#,.net 3.5

我试图创建一个具有泛型方法的基类。从它继承的类应该指定方法的类型

这样做的前提是创建管理筛选的类

因此,我:

 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的泛型方法吗
//公共抽象IQueryable GetFilter(IQueryable查询);
}
公共类ProjectFilter:FilterBase{
公共IQueryable GetFilter(IQueryable查询){
//处理查询
返回查询;
}
}
公共类项目列表{
公共静态项目列表GetList(项目筛选器筛选器){
变量查询=/…Linq代码。。。
query=filterCriteria.GetFilter(查询);
}
}
我认为这很简单,但我无法在FilterBase中获得GetFilter抽象方法的正确语法

编辑


理想情况下,您希望仅将方法保留为泛型,而不是类。如果不可能,请让我知道..

将FilterBase类本身设置为泛型

public abstract class FilterBase<T>
{
    public abstract IQueryable<T> GetFilter(IQueryable<T> query);
}
公共抽象类过滤器库
{
公共抽象IQueryable GetFilter(IQueryable查询);
}
这将使您能够像这样创建ProjectFilter类:

public class ProjectFilter : FilterBase<Linq.Project>
{
    public override IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query)
    {
        //do stuff with query
        return query;
    }
}
公共类项目过滤器:过滤器库
{
公共覆盖IQueryable GetFilter(IQueryable查询)
{
//处理查询
返回查询;
}
}
公共抽象类过滤器库{
公共抽象IQueryable GetFilter(IQueryable查询);
}

当然,您可以有一个抽象的通用方法:

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

所以
FilterBase
不能仅仅实现
GetFilter
。需要实现
GetFilter
GetFilter
等。;简而言之,
GetFilter
。因此,您可以看到它不是一个限制。

这是可行的,但我必须使类成为泛型吗?我不能保持方法的通用性吗?我问的原因是,同一个类可能有多个GetFilter采用不同于'Linq.Project'的IQueryable@B Z:您只能将该方法设置为泛型,但在调用之前,它必须保持泛型。当您试图回答问题时,不能从非泛型类派生并在方法上指定泛型类型。在这种情况下,调用方必须向该方法提供类型。@Mark-thx。对我来说似乎是个限制?你知道有没有进一步的解释?也许在Jon Skeet的C#Depth中?@B Z:如果类不是泛型的,那么方法的签名包含无限泛型。您试图做的是同时用构造的类型重写该方法。这或多或少相当于试图覆盖一个成员并同时更改其签名——不管是泛型还是非泛型,这都是不允许的。Jon Skeet的书中有一整章都是关于泛型的,但我不能说它是否完全回答了你的问题。你的代码在语法上是不正确的。GetFilter本身不应该是泛型的,并且您缺少ProjectFilter中的“覆盖”。
public abstract class FilterBase {
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query);
}
FilterBase fb = new ProjectFilter(...);
IQueryable<string> query = ...;
IQueryable<string> filter = fb.GetFilter<string>(query);