IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Méthode générique et héritage


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut Méthode générique et héritage
    Bonjour,

    J'ai une classe d'objet nommée "ReferentielBase". J'ai 2 classes ClasseA et ClasseB qui hérite de cette classe.
    Dans ma couche d'accès aux données, je souhaiterai n'avoir qu'une méthode pour aller récupérer une liste de ClasseA ou de ClasseB.
    J'avais pensé faire quelque chose dans ce genre, mais ça ne fonctionne pas. Je n'ai pas tout compris semble-t-il...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public IEnumerable<T> GetReferentiel<T>(string trigramme) where T : ReferentielBase
            {
                try
                {
                    var db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
                    IRowMapper<ReferentielBase> refMapper = MapBuilder<ReferentielBase>.MapAllProperties()
                                                                .Map(x => x.Id).ToColumn("REF_ID")
                                                                .Map(x => x.Code).ToColumn("REF_CODE")
                                                                .Map(x => x.Lib_Court).ToColumn("REF_LIBELLE_COURT")
                                                                .Map(x => x.Lib_Long).ToColumn("REF_LIBELLE_LONG")
                                                                .Map(x => x.Base).ToColumn("REF_BASE")
                                                                .Map(x => x.Ordre).ToColumn("REF_ORDRE")
                                                  .Build();
                    var refs = db.ExecuteSprocAccessor<ReferentielBase>("S_REF.T_R_SELECT", refMapper, trigramme);
                    return refs;
                }
                catch(Exception ex)
                {
                    var rethrow = DataAccessExceptionHandler.HandleException(ref ex);
                    if (rethrow)
                    {
                        throw ex;
                    }
                    return null;
                }
            }
    Merci de votre aide

  2. #2
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    mais ça ne fonctionne pas
    Pourrais tu être un peu plus spécifique ? Quel est le message d'erreur, sur quelle ligne, etc ?
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Tu as le type T, c'est l'occasion de s'en servir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public IEnumerable<T> GetReferentiel<T>(string trigramme) where T : ReferentielBase
            {
                try
                {
                    var db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
                    IRowMapper<T> refMapper = MapBuilder<T>.MapAllProperties()
                                                                .Map(x => x.Id).ToColumn("REF_ID")
                                                                .Map(x => x.Code).ToColumn("REF_CODE")
                                                                .Map(x => x.Lib_Court).ToColumn("REF_LIBELLE_COURT")
                                                                .Map(x => x.Lib_Long).ToColumn("REF_LIBELLE_LONG")
                                                                .Map(x => x.Base).ToColumn("REF_BASE")
                                                                .Map(x => x.Ordre).ToColumn("REF_ORDRE")
                                                  .Build();
                    var refs = db.ExecuteSprocAccessor<T>("S_REF.T_R_SELECT", refMapper, trigramme);
                    return refs;
                }
                catch(Exception ex)
                {
                    var rethrow = DataAccessExceptionHandler.HandleException(ref ex);
                    if (rethrow)
                    {
                        throw ex;
                    }
                    return null;
                }
            }

  4. #4
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    L'erreur se produit à la compilation. Il ne peut pas convertir implicitement un IEnumerable<ReferentielBase> en IEnumerable<T>.
    Or de la même manière, si je remplace mon IRowMapper<ReferentielBase> en IRowMapper<T>, je ne peux plus utiliser les méthodes Map du MapBuilder, vu qu'il ne reconnaît plus les propriétés de ReferentielBase.
    En utilisant le type T, j'obtiens cette erreur :

    'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TResult' in the generic type or method 'Microsoft.Practices.EnterpriseLibrary.Data.DatabaseExtensions.ExecuteSprocAccessor<TResult>(Microsoft.Practices.EnterpriseLibrary.Data.Database, string, Microsoft.Practices.EnterpriseLibrary.Data.IRowMapper<TResult>, params object[])'

    Merci

  5. #5
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    Je viens de trouver la réponse ici :
    http://stackoverflow.com/questions/7...-with-generics
    Ca fonctionne effectivement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public IEnumerable<T> GetReferentiel<T>(string trigramme) where T : ReferentielBase, new()
            {
                try
                {
                    var db = EnterpriseLibraryContainer.Current.GetInstance<Database>();
                    IRowMapper<T> refMapper = MapBuilder<T>.MapAllProperties()
                                                                .Map(x => x.Id).ToColumn("REF_ID")
                                                                .Map(x => x.Code).ToColumn("REF_CODE")
                                                                .Map(x => x.Lib_Court).ToColumn("REF_LIBELLE_COURT")
                                                                .Map(x => x.Lib_Long).ToColumn("REF_LIBELLE_LONG")
                                                                .Map(x => x.Base).ToColumn("REF_BASE")
                                                                .Map(x => x.Ordre).ToColumn("REF_ORDRE")
                                                  .Build();
                    var refs = db.ExecuteSprocAccessor<T>("S_REF.T_R_SELECT", refMapper, trigramme);
                    return refs;
                }
                catch(Exception ex)
                {
                    var rethrow = DataAccessExceptionHandler.HandleException(ref ex);
                    if (rethrow)
                    {
                        throw ex;
                    }
                    return null;
                }
            }
    Merci de votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Méthode static et héritage
    Par Mogwaï dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2008, 13h31
  2. type générique avec héritage multiple
    Par apqmwnqmap dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2008, 15h56
  3. Réponses: 9
    Dernier message: 13/03/2008, 13h25
  4. Réponses: 10
    Dernier message: 04/03/2008, 16h13
  5. [jse5/generics] Méthodes génériques
    Par palnap dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2008, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo