2010-08-19 3 views
0

Est-ce quelque chose comme cela possible?L'utilisation de la propriété MethodInfo Method à partir d'une action <T> delegate dans il.EmitCall

// 
// create a delegate 
Action<Type> action = (t) => t.DoSomething; 

// 
// get the IL generator for a method 
ILGenerator il = myMethodBuilder.GetILGenerator(); 

// 
// try and call the delegate 
il.EmitCall(OpCodes.Callvirt, action.Method, null); 

Je reçois une exception MethodAccessException chaque fois que j'essaie d'appeler la méthode.

Merci

Répondre

3

Im obtenir un MethodAccessException chaque fois que je tente d'invoquer la méthode.

Ceci est dû au fait que la méthode générée pour le lambda C# (t) => t.DoSomething est privée. Les chances sont que ce lambda ne soit pas statique non plus, selon les variables locales qu'il capture à partir de la méthode externe. Vous émettez une instruction callvirt mais vous ne semblez pas fournir d'instance.

Vous pouvez le vérifier en chargeant le code de votre application dans Reflector et en regardant la mise en œuvre de votre (t) => t.DoSomething lambda.

Vous devez soit:

  • Améliorez votre lambda à une véritable méthode public static dans une classe
  • externe visible Trouver un moyen d'inclure un paramètre de type Action<Type> dans votre méthode IL, générer du code appels Action<Type>.Invoke, puis passer votre variable action dans la méthode générée
+0

Je peux voir le MethodInfo IsPrivate est vrai, est-il un moyen de changer cela? Sinon, je peux juste utiliser un membre public statique, mais son plus propre avec un Lambda :) Merci –

+0

Il n'y a aucun moyen de changer cela; C'est un détail d'implémentation du compilateur C# –

+1

En y réfléchissant davantage, votre meilleure option pourrait être de trouver un moyen de transmettre le délégué 'action' dans votre méthode générée, soit en ajoutant un paramètre, soit en faisant de votre méthode générée une instance de classe membre et en définissant un champ sur cette classe. Parce que vous appelez votre lambda via un délégué, vous ne serez pas sensible à la façon dont ce lambda est implémenté. –

0

Si vous utilisez une méthode dynamique, vous pouvez utiliser les contrôles de visibilité de saut dans la gigue.

Questions connexes