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 :

changer dynamiquement le corps d'une méthode


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut changer dynamiquement le corps d'une méthode
    Dans mon assembly (qui est chargé en mémoire), j'ai la classe suivante :
    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
     
            public class myString
            {
                private string _s;
     
                public myString(string s)
                {
                    _s = s;
                }
     
                public void uneFonction()
                {
                    Console.WriteLine("V1"+_s);
                }
            }
    DOnc quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myString myS = new myString("toto");
    myS.uneFonction();
    j'obtiens : V1toto


    Je voudrais pouvoir dynamiquement changer le code de uneFonction. (Par exemple afficher V2+_s). En regardant du coté de la réflection j'ai trouvé des trucs sympatiques mais rien de concluant. Est ce que d'après vous cela est faisable et comment?

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    Deux approches possibles, ton exemple étant tres simple, on pourrait
    envisager que ta classe possède un parametre String en libre accès pour modifier par exemple V1 en V2....

    Maintenant, tu peux aussi passer par la technologie des "plug-in"... à savoir,
    définir une interface que tes plug-ins doivent implémenter.. et ensuite, à chaque
    fois que tu as un nouveau plug-in, tu instancies les méthodes appropriés et tu peux charger dynamiquement ce plug-in.. etc, etc...

    Autre solution envisageable, utiliser CSharpCodeProvider pour compiler en mémoire (ou sous forme de dll) le code que tu dois utiliser et ensuite, l'appeler
    via le point d'appel que t'auras fourni CSharCodeProvider

    Voila les 3 solutions que j'envisagerais pour un tel problème

    The Monz, Toulouse

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 27
    Par défaut
    Salut, regarde du côté du namespace System.Reflection.Emit du msdn (surtout les méthodes dynamiques) : tu peux emettre du code MSIL pour faire évoluer tes classes dynamiquement.

    Sinon tu as le pattern 'décorateur', côté conception. Tout dépend de ce dont tu as besoin exactement.

    Ceci dit il est rare d'avoir à se servir de tout ça ; tu as reellement besoin que ce soit la même méthode, avec la signature identique, d'une même classe (pas un type hérité) qui évolue ? C'est plus que rare, comme besoin.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut
    Bon c'est vrai que j'ai pris un exemple relativement simple et qui du coup ne reflete peu etre pas totalement ma problématique.

    En rentrant un peu plus dans les détails, je voudrais pouvoir modifier pendant l'éxécution de mon programme le comportement de uneFonction.
    i-lancement du prog
    ii-Initialement myS.uneFonction(); affiche "V1+_s".
    iii-pendant l'éxécution, je me dit tiens cela serait bien si, finalement, lorsque'un objet de type myString appelle uneFonction alors il affiche _s+_s.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    myString myS = new myString("toto");
    myS.uneFonction(); //affiche V1toto
     
    //ici je fais ce qu'il faut...
     
    myS.uneFonction();//affiche totototo

    Je pense que ta troisième réponse (CSharCodeProvider ) peut permettre cela. Mais je me demande comment faire pour:
    1-"compléter" la classe myString en lui ajoutant la nouvelle focntion
    2-lorsqu'il y a un appel à uneFonction (la méthode initiale), alors c'est la seconde version qui est appelé
    3-comment la seconde version de la fonction peut-elle connaitre le champs _s ?

  5. #5
    Membre Expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Par défaut
    Avant tout, regarde ces deux design pattern :

    - Stratégie : te permet de "brancher" et "débrancher" lors de l'exécution, des comportements prévus à l'avance

    - Décorateur : permet d'ajouter du comportement à l'exécution

    Dans les deux cas les comportements doivent être prévus.

    Si ce n'est pas ton but, la création et la compilation de code à la volée avec CSharpCodeProvider sera indispensable.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut
    Avant tout, regarde ces deux design pattern :

    - Stratégie : te permet de "brancher" et "débrancher" lors de l'exécution, des comportements prévus à l'avance

    - Décorateur : permet d'ajouter du comportement à l'exécution

    Dans les deux cas les comportements doivent être prévus.

    Si ce n'est pas ton but, la création et la compilation de code à la volée avec CSharpCodeProvider sera indispensable.
    Le comportement n'est pas prévu, l'utilisateur tape à la main le nouveau corps de la fonction.

    CSharpCodeProvider me permet de créer des classes à aprtir de zéro mais je n'arrive pas modifier une classe présente (pex lui ajouter une nouvelle méthode ou modifier le comporetemetn d'une méthode existante)...

  7. #7
    Membre Expert
    Avatar de hed62
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    2 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 029
    Par défaut
    Alors combine "stratégie" et CSharpCodeProvider :

    La classe centrale et immuable contient une instance d'une autre classe qui elle implémente une interface ne disposant que d'une méthode, ma_fonction().

    Ca c'est stratégie.

    Avec CSharpCodeProvider, tu écris une de ces stratégie, qui implémentera "ma_fonction" avec le code de l'utilisateur.

    Ensuite, tu charge le code de cette classe, et l'associe avec la classe centrale.

    Ainsi, tu auras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class ClasseCentrale
    {
     private IStrategie strategie;
    // cstr, getter, setter, etc...
     
    public void ma_fonction()
    {
     strategie.ma_fonction();
    }
    }

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/09/2007, 18h11
  2. Réponses: 1
    Dernier message: 29/08/2006, 12h01
  3. Réponses: 2
    Dernier message: 21/07/2006, 06h55
  4. Réponses: 3
    Dernier message: 31/08/2005, 17h52
  5. Comment changer dynamiquement la valeur d'une option de DbGrid ?
    Par Atrebate62 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/03/2005, 13h35

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