2009-08-28 10 views
6

C#, .net 3.5C# Streszczenie Metoda ogólna

Próbuję utworzyć klasę bazową, która ma metodę generyczną. Klasy, które dziedziczą z niego, powinny określać typ (typy) metody.

Przesłanką tego jest tworzenie klas zarządzających filtrowaniem.

Więc mam:

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

    } 

} 

że to jest coś proste, ale nie mogę uzyskać prawo składni w FilterBase dla abstrakcyjnej metody getFilter.

EDIT

Idealnie chciałby zachować tylko metodę jako ogólny i nie klasy. Jeśli nie jest to możliwe, proszę dać mi znać ..

Odpowiedz

15

Ustawia samą klasę FilterBase jako ogólną.

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

byłoby to pozwalają utworzyć klasę ProjectFilter tak:

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

który działa, czy muszę jednak sprawić, aby klasa była ogólna? Czy nie mogę po prostu zachować ogólnej metody? Rozumiem, że może istnieć wiele GetFilterów dla tej samej klasy, które przyjmują inne IQueryable niż "Linq.Project" –

+1

@B Z: Można uczynić tylko ogólną metodę, ale wtedy będzie musiała pozostać ogólna do czasu jej wywołania. Nie możesz wywodzić się z klasy nietypowej i przypisać typ ogólny do metody podczas próby pytania. W takim przypadku osoba wywołująca musiałaby podać typ tej metody. –

+0

@ Mark - thx. Wydaje mi się, że to ograniczenie? Czy wiesz, czy istnieje dalsze wyjaśnienie? Może w C# In Depth Jona Skeeta? –

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

Oczywiście, można mieć abstrakcyjną metodę Generic:

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

Problemem jest to, że to nie znaczy, czego chcesz. Można go nazwać dowolnym numerem T. W szczególności, co następuje muszą pracować, ponieważ ProjectFilter wywodzi FilterBase:

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

Więc FilterBase nie można po prostu wdrożyć GetFilter<Linq.Project>. Musi wdrożyć GetFilter<string>, GetFilter<int> itd .; w skrócie: GetFilter<T>. Więc możesz zobaczyć, że to nie jest ograniczenie.