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 :

Instanciation dynamique de classe


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Instanciation dynamique de classe
    Bonjour,

    Je travaille sur un projet web en .NET/C# et j'ai une méthode qui instancie une classe pour appeler sa méthode (ExecuteService()).
    Toutes mes classes métiers ont une méthode de classe se nommant ExecuteService (elles en héritent toutes).
    Je voudrais pouvoir passer en paramètre une chaine de caractère avec le nom de la classe à instancier mais je ne sais pas comment on instancie à partir d'un string.

    Pouvez vous m'aider?

    Merci.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 176
    Points : 25 118
    Points
    25 118
    Par défaut
    system.activator.createinstance


    voir aussi le design pattern de fabrique de classe (factory)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Merci pour la réponse mais j'ai essayé de regarder comment utiliser mais il y a quelque chose qui m'échappe.

    Je vais reproduire le schéma d'appel de méthode:

    méthode A: depuis une page spécifique , appel une méthode ListeMvt.

    méthode ListeMvt: instancie une classe pour appeler sa méthode ExecuteService.

    méthode ExecuteService : execute le bon service.

    Si la méthode A (qui connait la classe à instancier) passe l'objet System.Type à la méthode ListeMvt comme ceci:
    System.Type type = typeof(ClasseA);
    ListeMvt(type);

    La méthode ListeMvt doit faire appel à CreateInstance:
    object mou = System.Activator.CreateInstance(type_instance);

    Mais pour faire appel à la méthode de la ClasseA, il faut transtyper l'object mou en ClasseA.
    Or la méthode ListeMvt, pour pouvoir le faire dynamiquement, ne peut pas effectuer un tel cast?
    Sinon, retour à la case départ: comment caster dynamiquement la classe?

    ça doit peut etre etre trés bete ce que je dis mais je ne vois toujours pas comment faire et je ne pige pas un mot de la doc msdn sur le sujet.

    Quelqu'un pourrait il me donner un exemple d'instanciation dynamique pour que je finisse enfin par comprendre?

    Encore merci.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    J aurais tendance a dire que ta methode ListeMvt doit etre generique du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ListeMvt <T> ( T classeX)
    {
       Type typeInstance = typeof (classeX);
     
       object mou = ....
     
    }

    Sauf que dans ta methode A tu peux pas ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListeMvt<typeof(classeA)> (classeA);
    Donc t es obligé d utiliser la reflection pour appeler dynamique une methode generique, genre en faisant un truc du style : http://www.guroot.com/?p=102
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       private object invokeGenericMethod(string typeName,string methodName,object[] parameters)
            {
     
                Type type = System.Type.GetType(typeName);
     
                MethodInfo method = this.GetType().GetMethod(methodName,
                    BindingFlags.Public | BindingFlags.Instance);
     
                MethodInfo genericMethod = method.MakeGenericMethod(type);
                return genericMethod.Invoke(this, parameters);
     
            }
    Ou alors tu te prends pas la tete, tu mets le code de ListeMvt dans ta methode A, et tu fais comme ce que j ai fait hier dans mon post :
    http://www.developpez.net/forums/d65...e-dexceptions/ (dernier post)

    Dans cet exemple je gere une collection de classe qui implementent toute la meme methode, je les parcours et execute la methode pour chacune d elle, j ai l impression que c est un peu ca que tu essayes de faire...

    ou alors je suis a la ramasse comme d had...

  5. #5
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Pour être sûr de comprendre... à partir de quelle information tu prends la décision d'instancier une classe de type machin, ou de type truc, ou de type bidule ?

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 176
    Points : 25 118
    Points
    25 118
    Par défaut
    si tu as plusieurs classes qui ont la meme méthode, soit elles doivent toutes hérité d'une classe de base soit elle doivent implémenter une interface
    ensuite tu peux donc caster ton object créé en la classe de base ou l'interface en vue d'appeler cette sub sur différents type d'instances

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    si tu as plusieurs classes qui ont la meme méthode, soit elles doivent toutes hérité d'une classe de base soit elle doivent implémenter une interface
    ensuite tu peux donc caster ton object créé en la classe de base ou l'interface en vue d'appeler cette sub sur différents type d'instances
    Effectivement c'était tout con!
    Il suffisait de rajouter les instructions :

    AbstractMetier abs = mou as AbstractMetier;

    et ça roule!

    Merci pour toutes vos infos!

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

Discussions similaires

  1. Instanciation dynamique d'une classe
    Par larnin_ dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2013, 16h24
  2. Réponses: 9
    Dernier message: 15/02/2013, 23h27
  3. Réponses: 2
    Dernier message: 14/09/2007, 08h55
  4. Réponses: 3
    Dernier message: 19/07/2007, 22h10
  5. [c# 2.0] Instanciation dynamique de classe
    Par Arthis dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/10/2006, 18h03

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