0 votes

méthode d'extension générique

Je travaille sur ce projet mvc en suivant la série de vidéos storefront de Rob Connery et en appliquant les techniques. Sur les méthodes de filtrage et d'extension, j'ai commencé à me répéter beaucoup comme par exemple :

public static Sponsor WithID(this IQueryable<Sponsor>qry, int ID)
{
    return qry.SingleOrDefault(s => s.ID== ID);
}

public static Keyword WithID(this IQueryable<Keyword>qry,int ID)
{
    return qry.SingleOrDefault(s => s.ID== ID);
}
....

Pour éviter cela, j'essaie d'écrire une extension générique comme celle-ci :

public static T WithID<T>(this IQueryable<T>qry,int ID)
{
    return qry.SingleOrDefault(s=>ID==ID);
}

Cependant, s n'a pas d'identifiant, comment résoudre ce problème ?

5voto

Jon Skeet Points 692016

Vous aurez besoin d'une interface qui déclare une propriété ID, par exemple

public interface IInt32Identifiable
{
    public int ID { get; }
}

Ensuite, vous pouvez écrire :

public static T WithID<T>(this IQueryable<T> source, int id)
    where T : IInt32Identifiable
{
   return source.SingleOrDefault(s=> s.ID == id);
}

Bien sûr, vous devrez faire en sorte que toutes les classes appropriées implémentent l'interface, mais c'est généralement facile ; si les classes sont générées par le concepteur, vous voudrez probablement utiliser des classes partielles.

0voto

Jeff Yates Points 36725

Vous auriez besoin de deux méthodes d'extension différentes. Une pour les types qui ont un ID et une pour les types qui n'en ont pas. Il faut également une interface ou une classe de base abstraite que tous les types ayant un identifiant mettent en œuvre. Sinon, le compilateur ne vous laissera pas déréférencer l'ID.

La seule autre solution à laquelle je peux penser consisterait à demander à la réflexion de rechercher la propriété ID dans le type et, si elle existe, d'en obtenir la valeur.

0voto

Dan Points 3922

Vous pouvez également transmettre le délégué à SingleOrDefault

    public static T WithID<T>(this IQueryable<T> qry, Func<T, bool> predicate)
    {
        return qry.SingleOrDefault(predicate);
    }

    Keyword kw = keywords.AsQueryable().WithID(item => item.ID == 314);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X