I Metodi di estensione non funziona per un'interfaccia
-
01-07-2019 - |
Domanda
Ispirato MVC storefront l'ultimo progetto a cui sto lavorando è utilizzando i metodi di estensione su IQueryable per filtrare i risultati.
Ho questa interfaccia;
IPrimaryKey
{
int ID { get; }
}
e ho questo metodo di estensione
public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
return source(obj => obj.ID == id);
}
Diciamo che ho una classe, SimpleObj che implementa IPrimaryKey.Quando ho un IQueryable di SimpleObj il GetByID un metodo che non esiste, a meno che non esplicitamente un cast IQueryable di IPrimaryKey, che è meno che ideale.
Mi manca qualcosa qui?
Soluzione
Funziona, se fatto nel modo giusto.cfeduke la soluzione funziona.Tuttavia, non è necessario per rendere il IPrimaryKey
interfaccia generica, in realtà, non è necessario modificare la definizione originale a tutti:
public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
return source(obj => obj.ID == id);
}
Altri suggerimenti
Edit: Konrad's la soluzione migliore, perché la sua molto più semplice.Il seguente soluzione funziona, ma solo in situazioni simili a ObjectDataSource dove un metodo di una classe viene recuperato attraverso la riflessione senza risalendo la gerarchia di ereditarietà.Ovviamente qui non funziona.
Questo è possibile, ho dovuto implementare un modello simile quando ho progettato un custom entity framework soluzione per lavorare con ObjectDataSource:
public interface IPrimaryKey<T> where T : IPrimaryKey<T>
{
int Id { get; }
}
public static class IPrimaryKeyTExtension
{
public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T>
{
return source.Where(pk => pk.Id == id).SingleOrDefault();
}
}
public class Person : IPrimaryKey<Person>
{
public int Id { get; set; }
}
Frammento di utilizzo:
var people = new List<Person>
{
new Person { Id = 1 },
new Person { Id = 2 },
new Person { Id = 3 }
};
var personOne = people.AsQueryable().GetById(1);
Questo non può lavorare a causa del fatto che i farmaci generici non hanno la capacità di seguire modelli di ereditarietà.ie.IQueryable<SimpleObj> non è nella struttura di ereditarietà della IQueryable<IPrimaryKey>