12 votes

Est-il possible de modifier le corps d'une méthode au moment de l'exécution en .NET ?

Je sais qu'il est possible (en théorie) de créer un nouveau type à l'exécution, mais est-il possible de modifier le corps d'une méthode d'un type existant à l'exécution ? Mon plan (si je parviens à le faire fonctionner) est de baliser les méthodes avec un attribut personnalisé, puis, lors de l'exécution, de rechercher les méthodes avec cet attribut et d'insérer mon propre code dans le corps de la méthode.

Des suggestions ?

Je suppose que si je n'arrive pas à faire fonctionner cette approche, je peux toujours opter pour une méthode virtuelle dans une classe de base (avec les attributs), combinée à une fabrique statique pour produire un type dynamique dérivé avec ma méthode générée à l'exécution dans la classe enfant. Cette méthode ne serait cependant pas aussi propre à l'emploi.

3voto

Timothy Khouri Points 14640

Vous ne pouvez pas modifier une méthode existante au moment de l'exécution, mais vous pouvez en créer une avec Code DOM à la volée et l'exécuter. Ou, vous pouvez concaténer ensemble des chaînes de code, les compiler en mémoire et les exécuter.

J'ai fait ce dernier cas moi-même (une application que j'avais permettait un code C# personnalisé qui était compilé et exécuté en mémoire, au moment de l'exécution).

2voto

mmiika Points 3027

Si vous cherchez à ajouter des aspects avant ou après l'invocation, jetez un coup d'œil à PostSharp : http://www.postsharp.org/

0voto

Peter Points 873

Prévoyez-vous de faire cela pour des types arbitraires ? Je suppose que non, étant donné que vous allez décorer les méthodes avec un attribut.

Dans ces conditions, je pense que la meilleure approche consiste à définir des méthodes abstraites dans une super classe pour vos types. Une méthode de la super classe peut héberger le code de la méthode passe-partout, et déléguer aux implémentations concrètes via les méthodes abstraites le comportement de cette méthode pour le type individuel.

D'une manière générale, cependant, à moins de créer des fichiers de code et de compiler des assemblages dynamiques au moment de l'exécution, ce que vous cherchez à faire est impossible. Il existe probablement des principes et des modèles OO beaucoup plus pratiques que vous pouvez utiliser pour obtenir pratiquement le même résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X