2010-09-05 22 views
1

Il existe de nombreux threads sur la façon de créer une méthode à l'aide de Reflection.Emit, mais je ne trouve pas de clonage ou de copie d'une méthode existante..NET: clonage dynamique d'une méthode existante avec Reflection.Emit

Je voudrais copier une classe existante et y ajouter quelques champs supplémentaires. J'ai du mal à copier les méthodes. J'ai lu que vous ne pouvez pas simplement prendre le code IL du corps parce que les jetons appartiennent au module existant. Est-il possible de cloner ou de copier une méthode de classe d'une autre classe à l'aide de MethodBuilder?

+0

Peut-être que [this] (http://blogs.msdn.com/b/haibo_luo/archive/2006/11/07/turn-methodinfo-to-dynamicmethod.aspx) peut aider –

Répondre

3

Eh bien, c'est possible mais assez gênant. Le problème est que la classe MethodBody vous permet uniquement de récupérer l'IL en tant que tableau d'octets. La méthode ILGenerator.Emit() n'a cependant pas une surcharge pour simplement copier ces octets dans la méthode dynamique. Cela nécessite que vous utilisiez la surcharge appropriée pour générer l'instruction IL appropriée.

Il est important non seulement de vous assurer que vous générez toujours une IL correcte, mais aussi de collecter des informations sur la méthode dynamique. Plus précisément, la taille de la pile requise pour la méthode. La seule façon de pouvoir utiliser ILGenerator.Emit() est d'écrire du code qui décompile les octets en premier dans leurs instructions IL correspondantes. Ce n'est pas impossible, juste beaucoup de travail. Je ne peux pas penser à un raccourci.

+1

Je pense que cela est possible court -cut: http://msdn.microsoft.com/fr-fr/library/system.reflection.emit.methodrental.swapmethodbody.aspx –

0

Jetez un oeil sur PostSharp et sa technologie sous-jacente.