2009-08-28 4 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); 

    } 

} 

Думаю, что это что-то простое, но я не могу получить синтаксис право в FilterBase для абстрактного метода GetFilter.

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# In в глубине? –

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. В частности, следующее должно работать, так как ProjectFilter происходит от FilterBase:

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

Так FilterBase не может просто реализовать GetFilter<Linq.Project>. Он должен реализовать GetFilter<string>, GetFilter<int> и т. Д .; короче говоря, GetFilter<T>. Таким образом, вы можете видеть, что это не ограничение.

Смежные вопросы