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 :

Génération dynamique de code (C# 2.0)


Sujet :

C#

  1. #1
    Membre confirmé
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Par défaut Génération dynamique de code (C# 2.0)
    Bonjour à tous,

    J'ai une petite question.

    Est-ce qu'il est possible d'ajouter dynamiquement une méthode à une classe?

    Exemple :
    Dans un projet, j'ai une classe publique avec plein des fonctions.
    Et dans un autre projet (d'une autre solution), j'ai besoin d'ajouter ponctuellement une fonction au premier projet.

    J'ai vu sur le web qu'on pouvait utiliser CSharpCodeProvider mais dans le cas du lien, ils modifient une méthode virtuelle. Et ils sont dans le même projet.

    Hélas, moi elle n'existe pas. Il faut que je l'a créé.

    Est-ce que c'est possible?

    Si vous avez des liens ou exemples ça m'aiderait.

    Merci de votre aide

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    C'est probablement faisable, reste à voir si c'est nécessaire.

    Une solution simple : si cette méthode n'a besoin que des membres publics de ta classe et que tu bosses avec C#3, tu peux utiliser les méthodes d'extension.

  3. #3
    Membre confirmé
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Par défaut
    En fait, j'ai 10 classes en tout et dans certains cas, j'ai besoin d'ajouter une méthode sur 6 classes.

    Par contre, je suis en C# 2.0...

    Cependant, si j'ai une classe comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public classe Toto
    {
      public Toto(){}
      private typeObj[] _Truc;
      public Truc
      {
        get { return _Truc}
        set { _Truc = value}
      }
    }
    Et moi, je veux accéder à la méthode Truc[0].MaMéthode().

    J'ai essayé avec des GetMethod GetType... mais je ne trouve pas la solution.

  4. #4
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Bonjour.

    Je ne suis pas sur de comprendre ....

    Tu veux au moment de l'exécution pour rajouter une méthode à une classe ? Si c'est le cas tu as un énorme problème de conception ....

    Si par contre tu veux juste accèder à une méthode qui ne serait dispo car tu utilises un objet de type supérieur à celui qui possède la méthode alors tu as deux solutions:
    - Gérer les cas avec le mot clef is qui permet de déterminer si un objet est du type souhaité.
    - La réflection en passant par GetType().GetMethods() ....

    Par contre la méthode de la reflection est bcp plus longue en terme d'exécution.

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Bonjour.

    Je ne suis pas sur de comprendre ....
    Moi non plus Dans l'exemple cité, en quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monToto.Truc[0].Methode();
    est insuffisant ?

  6. #6
    Membre confirmé
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Par défaut
    Et bien en fait, les classes, je n'ai pas le droit de les modifier et j'ai 6 classes différentes
    Toto1 Toto2 Toto3 avec des méthodes identiques mais des propriétés différentes.

    Vu que je fais du code le plus générique possible, le but est de mettre le nom de la classe en string et donc, là je me sers de GetType GetMethod...

    Mais, je n'arrive pas à y accéder.
    Je vais un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MethodInfo mtdInfo = typeToto.GetType().GetProperty("Truc").GetType().GetMethod("LaMethodeDeTrucQueJeVeux");
    Avec le mtdInfo.Invoke qui va bien.

    Hélas, je suis obligé du faire du générique "à outrance" car il se peut que rapidement, on passe à 10 classes, 15 classes...

  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par JaCaDi Voir le message
    Toto1 Toto2 Toto3 avec des méthodes identiques mais des propriétés différentes.
    Y a pas une classe de base ? une interface ? C'est qui le cochon qui a conçut se truc la ?

    Citation Envoyé par JaCaDi Voir le message
    Vu que je fais du code le plus générique possible, le but est de mettre le nom de la classe en string
    Pour le nom de la classe il faut utiliser Type.GetType("MaClasse") a condition que MaClasse soit dans le même assembly que la classe appelante.

    Citation Envoyé par JaCaDi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MethodInfo mtdInfo = typeToto.GetType().GetProperty("Truc").GetType().GetMethod("LaMethodeDeTrucQueJeVeux");
    Avec le mtdInfo.Invoke qui va bien.
    Et ça marche pas ça ?

  8. #8
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Si on résume.

    Tu as n classes Toto1 Toto2, ... qui n'ont pas d'héritage commun mais qui ont des méthodes du même nom.

    Tu as des fonctions qui doivent manipuler des Toto. Et tu voudrais regrouper certaines de ces fonctions, en se débrouillant pour qu'elles puisse prendre en entrée n'importe quel Toto.
    Donc ça veut dire que ta méthode prend un Toto sous forme d'object, puisqu'il n'y a pas d'héritage commun. me trompe-je ?

    La réflexion est puissante, mais elle n'est pas fait pour pallier des défauts de conception. Je dis pas ça contre toi puisque tu n'es pas responsable du design de ces classes, mais si n objets ont des propriétés communes et peuvent être manipulés de la même façon, il faut utiliser l'héritage. Tout le reste n'est que de la bidouille.

  9. #9
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Pour completer les propos de Guulh.

    La classe mère commune qui n'existe pas est peut etre juste une erreur de design. Le besoin de cette class apparaisssant seuleument dans la phase de design et pas dans celle specifications... (classe de conception)

    Tout ca pour dire que les spec peuvent etre parfaites, mais l'archi qui suit est mal concue.

  10. #10
    Membre confirmé
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Par défaut
    En fait, ce sont des accès à une base de données un peu bizarre.
    Chaque classe permet de communiquer avec une "table". J'ai donc 10 tables différentes dont 6 qui ont des tables liées.

    À refaire en C# et "une vraie base de donnée", ça serait très simple. Mais vu que l'on ne peux rien changer au niveau archi du client et qu'il veut qu'on fasse un copier coller de son vieux code (natweb pour ceux qui connaissent) en C#.
    On est un peu obligé de bidouiller. Surtout que niveau structure de l'application, on est bloqué aussi car il nous impose presque le nom des classes et des variables à utiliser.

    Donc, là, je bidouille. Mais dès que le client verra le potentiel de .Net, faudrait tout refaire ou presque.

    Toujours est-il que j'ai des classes Toto1, Toto2... que je ne peux pas modifier et je peine un peu beaucoup à accéder aux méthodes qui sont dedans (merci la msdn) et aux sous méthodes.

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Et ça marche pas ça ?
    Non car le deuxième getType renvoie PropertyInfo.

    Il faudrait utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MethodInfo mtdInfo = typeToto.GetType().GetProperty("Truc").PropertyType.GetMethod("LaMethodeDeTrucQueJeVeux");
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  12. #12
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    C'est sûr qu'on fait souvent avec ce qu'on a

    Mais en l'occurrence je pense que tu peux t'en sortir sans utiliser la réflexion. Je connais pas les détails de ton projet, mais il doit y avoir un Design Pattern qui permet d'"assainir" du code mal fichu. Je dirais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    interface ITotoWrapper
    {
      public void LaMéthodeCommune();
    }
     
    class Toto1Wrapper : ITotoWrapper
    {
    private Toto1 _toto1;
    public Toto1Wrapper(Toto1 t1) { _toto1 = t1; }
    public void LaMéthodeCommune() {return _toto1.LaMéthodeCommune(); }
    }
    Tu manipules donc toujours des ITotoWrapper, et il te suffit de créer une classe wrapper par Toto différent.

    C'est ce qui me serait venu à l'esprit si la réflexion n'existait pas en C#. Après, c'est à toi de juger ce qui te paraît le plus adapté et maintenable dans le cadre de ton projet

  13. #13
    Membre confirmé
    Avatar de Psycadi
    Homme Profil pro
    Chef de projet - Expert en message box
    Inscrit en
    Juillet 2003
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet - Expert en message box

    Informations forums :
    Inscription : Juillet 2003
    Messages : 147
    Par défaut
    Merci pour votre aide à tous.
    Je vais essayer de faire valider l'implémentation d'une interface

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/04/2007, 14h06
  2. [DOM] Génération dynamique fichier xml
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/10/2005, 09h45
  3. [SQL*Plus] génération dynamique du fichier de spool
    Par lalystar dans le forum Oracle
    Réponses: 3
    Dernier message: 06/12/2004, 10h44
  4. Réponses: 7
    Dernier message: 22/10/2004, 16h18
  5. [Plugin]Gestion de génération automatique de code
    Par Maggic dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 11/05/2004, 11h35

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