2009-08-28 18 views
6

C#, .net 3.5C# Abstract Metodo generico

Sto provando a creare una classe base che ha un metodo generico. Le classi che ne ereditano dovrebbero specificare il/i tipo/i del metodo.

La premessa per questo è per la creazione di classi che gestiscono il filtraggio.

Così ho:

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

    } 

} 

pensano che sia qualcosa di semplice, ma non riesco a ottenere la giusta sintassi nel FilterBase per il metodo astratto GetFilter.

EDIT

Idealmente, vorrebbe mantenere solo il metodo come generico e non la classe. Se non è possibile, per favore fatemelo sapere ..

risposta

15

Rendi generica la classe FilterBase.

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

Ciò consentirebbe di creare la classe ProjectFilter come questo:

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

che funziona, devo però fare la classe generica? Non posso semplicemente mantenere il metodo generico? Motivo che chiedo è che ci possono essere più GetFilter per la stessa classe che prendono un IQueryable diverso rispetto a 'Linq.Project' –

+1

@B Z: È possibile rendere solo il metodo generico, ma dovrà rimanere generico fino a quando non viene richiamato. Non puoi derivare dalla classe non generica e assegnare il tipo generico al metodo mentre provi nella tua domanda. In questo caso, il chiamante dovrebbe fornire il tipo al metodo. –

+0

@Mark - thx. Mi sembra una limitazione? Sai se ci sono ulteriori spiegazioni là fuori? Forse nel C# In Depth di Jon Skeet? –

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

Naturalmente, si può avere un metodo generico astratto:

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

Il problema è che non significa quello che vuoi. Può essere chiamato per qualsiasi T. In particolare, quanto segue deve lavorare, dal momento che deriva da ProjectFilterFilterBase:

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

Quindi FilterBase Non si può semplicemente implementare GetFilter<Linq.Project>. Deve implementare GetFilter<string>, GetFilter<int>, ecc .; in breve, GetFilter<T>. Quindi puoi vedere che non è una limitazione.