2009-08-28 21 views
6

C#, .net 3.5C# Resumen Método genérico

Estoy tratando de crear una clase base que tenga un método genérico. Las clases que heredan de él deben especificar el (los) tipo (s) de método.

La premisa para esto es crear clases que administren el filtrado.

por lo que tengo:

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

    } 

} 

creo que es algo sencillo, pero no puedo obtener la sintaxis correcta en FilterBase para el método abstracto getFilter.

EDITAR

Lo ideal sería que le gustaría mantener sólo el método genérico y no a la clase. Si no es posible, por favor, hágamelo saber ..

Respuesta

15

Haga que la clase FilterBase sea genérica.

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

Esto le permitirá crear su clase ProjectFilter así:

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

que funciona, ¿tengo que hacer la clase genérica? ¿No puedo simplemente mantener el método genérico? Motivo por el que pregunto es que puede haber varios GetFilter para la misma clase que toman un IQueryable diferente que 'Linq.Project' –

+1

@B Z: Puede hacer que el método sea genérico, pero deberá permanecer genérico hasta que se invoque. No puede derivar de la clase no genérica y asignar el tipo genérico en el método mientras intenta en su pregunta. La persona que llama debería proporcionar el tipo del método en ese caso. –

+0

@Mark - thx. Parece una limitación para mí? ¿Sabes si hay más explicación por ahí? ¿Tal vez en C# In Depth de Jon Skeet? –

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

Por supuesto, usted puede tener un método genérico abstracto:

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

El problema es que no significa lo que quieres Se puede llamar para cualquier T. En particular, el siguiente debe trabajar, ya que se deriva de ProjectFilterFilterBase:

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

Así FilterBase no puede simplemente aplicar GetFilter<Linq.Project>. Necesita implementar GetFilter<string>, GetFilter<int>, etc .; en resumen, GetFilter<T>. Entonces puedes ver que no es una limitación.

Cuestiones relacionadas