Voici mon problème

Signaler
Messages postés
3
Date d'inscription
samedi 10 novembre 2007
Statut
Membre
Dernière intervention
15 septembre 2010
-
Messages postés
23
Date d'inscription
mercredi 15 septembre 2010
Statut
Membre
Dernière intervention
23 septembre 2010
-
Bonjour csharpfr,
Voici mon problème :

J'ai besoin que pour toutes les méthodes d'une classe, il s'effectue une action avant et après l'exécution du code.
Pour exemple, là c'est un loader que je doit activer dans chaque méthodes d'une classe (car il y a d'assez conséquents requetages linq qui freezent l'application quelques secondes).

Il y a un design pattern qui répond a ça ? Ou des events particuliers utilisables en c# ?

Merci pour vos conseils

4 réponses

Messages postés
234
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
3 novembre 2011
1
Hmm question intéressante. Je ne pense pas qu'il y ai un pattern prévu pour cela malheureusement.
Néanmoins tu peux faire quelque chose comme ceci :

        public class MyClass
        {

            void ToDoBefore()
            {
            }

            void ToDoAfter()
            {
            }

            public object ExecuteMethod(string methodName, object[] args)
            {
                var method = this.GetType().GetMethod(methodName);

                ToDoBefore();
                object returnValue = method.Invoke(this, args);
                ToDoAfter();

                return returnValue;
            }
        }


Le problème c'est que tous les appels doivent être faits en passant par cette méthode personnalisée. Par exemple je veux appeler "MaMethode" en appelant automatiquement une méthode avant et après son exécution :

ExecuteMethod ("MaMethode", null);

Un autre moyen serait de modifier dynamiquement le code de ta classe ... Mais cela dépasse mes compétences.

Simon
Messages postés
3
Date d'inscription
samedi 10 novembre 2007
Statut
Membre
Dernière intervention
15 septembre 2010

Cette solution fonctionne, j'avais préfèré ne pas l'appliquer, car il ne me semble pas que ce soit une bonne technique : l'intellisense ne va rien comprendre, je vais devoir caster tout les types de retour, et niveau écriture (et peut être aussi exécution) c'est assez lourd.

Surtout que pour mon exemple, ça me sert a afficher un loader sur les traitements lourds, c'est à dire quasiment toutes les méthodes de mon projet ^^

Je continue de réfléchir autour des events, l'observation .. mais ne je suis pas hyper à l'aise avec ces concepts, ni avec le language.
Messages postés
234
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
3 novembre 2011
1
Sinon, tu pourrais modifier dynamiquement le code des tes méthodes. Il serait assez simple d'ajouter à appel à une méthode au début du code. Mais pour exécuter après l’exécution cela serait beaucoup plus complexe ... Il faudrait parser les If, Switch, Return etc... pour être sûr que le code soit exécuté. Sinon un autre solution qui serait compatible d'avantage avec l'intellisense serait de créer un délègué pour chaques méthodes. Tu ajouterais à ce délégué la méthode avant l’exécution et après l’exécution.

        public class MyClass
        {
            public delegate void SampleDelegate();

            public SampleDelegate SampleMethodDel;


            void ToDoBefore()
            {
  

            }

            void ToDoAfter()
            {

            }

            private void SampleMethod()
            {

            }

            public MyClass()
            {
                SampleMethodDel += ToDoBefore;
                SampleMethodDel += SampleMethod;
                SampleMethodDel += ToDoAfter;
            }

        }


Tu accéderais aux méthodes comme suit :
MyClass.SampleMethodDel.Invoke();

C'est une solution plus propre, mais il faut que toutes les signatures soit identiques. Donc pour passer des arguments il faut définir un object[] args ... Ce qui n'est pas terrible.

Désolé de ne pouvoir t'aider d'avantage.

Simon
Messages postés
23
Date d'inscription
mercredi 15 septembre 2010
Statut
Membre
Dernière intervention
23 septembre 2010

Ah, c'est pas mal du tout ça. Je n'avais jamais appliqué le delegate, ça marcherai bien, mais ça va demander une rigueur supplémentaire pour la suite du développement dont je me passerai bien.

Je te remercie pour t'être creusé la tête !