Question

Inspiré par la vitrine MVC, le dernier projet sur lequel je travaille utilise des méthodes d'extension sur IQueryable pour filtrer les résultats.

J'ai cette interface;

IPrimaryKey
{
  int ID { get; }
}

et j'ai cette méthode d'extension

public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
    return source(obj => obj.ID == id);
}

Disons que j'ai une classe, SimpleObj, qui implémente IPrimaryKey. Lorsque j’ai un IQueryable de SimpleObj, la méthode GetByID n’existe pas, à moins que jette explicitement comme un IQueryable de IPrimaryKey, ce qui n’est pas idéal.

Est-ce que quelque chose me manque ici?

Était-ce utile?

La solution

Cela fonctionne, quand c'est bien fait. La solution de cfeduke fonctionne. Cependant, vous n'avez pas besoin de rendre générique l'interface IPrimaryKey, en fait, vous n'avez pas du tout besoin de changer votre définition d'origine:

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
    return source(obj => obj.ID == id);
}

Autres conseils

Modifier: La solution de Konrad est préférable, car c'est beaucoup plus simple. La solution ci-dessous fonctionne, mais n'est requise que dans des situations similaires à ObjectDataSource où une méthode d'une classe est récupérée par réflexion sans passer par la hiérarchie d'héritage. Évidemment, cela ne se produit pas ici.

C’est possible, j’ai dû mettre en œuvre un modèle similaire lors de la conception d’une solution de structure d’entités personnalisée pour travailler avec 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; }
}

Extrait d'utilisation:

var people = new List<Person>
{
    new Person { Id = 1 },
    new Person { Id = 2 },
    new Person { Id = 3 }
};

var personOne = people.AsQueryable().GetById(1);

Cela ne peut pas fonctionner car les génériques n’ont pas la capacité de suivre les schémas d’héritage. c'est à dire. IQueryable & Lt; SimpleObj & Gt; n'est pas dans l'arbre d'héritage d'IQueryable < IPrimaryKey >

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top