简体   繁体   English

C#抽象通用方法

[英]C# Abstract Generic Method

C#, .net 3.5 C#,。net 3.5

I am trying to create a base class that has a generic method. 我正在尝试创建一个具有泛型方法的基类。 Classes that inherit from it should specify the method's type(s). 从中继承的类应指定方法的类型。

The premise for this is for creating classes that manage filtering. 这样做的前提是创建管理过滤的类。

So I have: 所以我有:

 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); 

   }

 }

Think it is something simple, but I can't get the syntax right in FilterBase for the GetFilter abstract method. 认为这很简单,但我无法在FilterBase中为GetFilter抽象方法获得正确的语法。

EDIT 编辑

Ideally, would like to keep only the method as generic and not the class. 理想情况下,只想将方法保持为通用方法而不是类。 If not possible, then please let me know.. 如果不可能,请告诉我..

Make the FilterBase class itself generic. 使FilterBase类本身通用。

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

This would enable you to create your ProjectFilter class like this: 这将使您能够像这样创建ProjectFilter类:

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

Of course, you can have an abstract generic method: 当然,您可以使用抽象的通用方法:

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

The problem is that it doesn't mean what you want. 问题是它并不意味着你想要什么。 It can be called for any T . 任何T都可以调用它。 In particular, the following must work, since ProjectFilter derives from FilterBase : 特别是,以下必须起作用,因为ProjectFilter派生自FilterBase

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

So FilterBase can't just implement GetFilter<Linq.Project> . 所以FilterBase不能只实现GetFilter<Linq.Project> It needs to implement GetFilter<string> , GetFilter<int> , etc.; 它需要实现GetFilter<string>GetFilter<int>等; in short, GetFilter<T> . 简而言之, GetFilter<T> So you can see it isn't a limitation. 所以你可以看到它不是一个限制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM