2009-08-28 8 views
6

C#, .net 3.5C# Résumé Méthode générique

J'essaye de créer une classe de base qui a une méthode générique. Les classes qui en héritent doivent spécifier le (s) type (s) de la méthode.

La prémisse pour cela est de créer des classes qui gèrent le filtrage.

J'ai donc:

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

    } 

} 

pense qu'il est quelque chose de simple, mais je ne peux pas obtenir la syntaxe droite FilterBase pour la méthode abstraite GetFilter.

EDIT

Idéalement, aimerait garder que la méthode que générique et non la classe. Si ce n'est pas possible, veuillez me le faire savoir.

Répondre

15

Rendre la classe FilterBase elle-même générique.

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

Cela vous permettra de créer votre classe ProjectFilter comme ceci:

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

ça marche, dois-je rendre la classe générique? Je ne peux pas garder la méthode générique? Raison que je demande est il peut y avoir plusieurs GetFilter pour la même classe qui prennent un IQueryable différent que 'Linq.Project' –

+1

@B Z: Vous pouvez faire que la méthode générique, mais il devra rester générique jusqu'à invoqué. Vous ne pouvez pas dériver de la classe non générique et affecter le type générique à la méthode lorsque vous essayez dans votre question. L'appelant devrait fournir le type à la méthode dans ce cas. –

+0

@Mark - thx. On dirait une limitation à moi? Savez-vous s'il existe d'autres explications? Peut-être dans C# In Depth de Jon Skeet? –

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

Bien sûr, vous pouvez avoir une méthode générique abstraite:

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

Le problème est ça ne veut pas dire ce que tu veux. Il peut être appelé pour T. En particulier, les conditions suivantes doivent travailler, car ProjectFilter dérive de FilterBase:

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

Alors FilterBase ne peut pas simplement mettre en œuvre GetFilter<Linq.Project>. Il doit mettre en œuvre GetFilter<string>, GetFilter<int>, etc .; en résumé, GetFilter<T>. Donc vous pouvez voir que ce n'est pas une limitation.

Questions connexes