2010-04-07 3 views
1

Dans un previous question, j'ai demandé comment obtenir un MethodInfo à partir d'un délégué d'action. Ce délégué d'action a été créé de manière anonyme (à partir d'un Lambda). Le problème que je suis maintenant est que je ne peux pas invoquer le MethodInfo, car il nécessite un objet auquel appartient le MethodInfo. Dans ce cas, puisque les délégués sont anonymes, il n'y a pas de propriétaire. Je reçois l'exception suivante:Comment invoquer un MethodInfo créé à partir d'une méthode anonyme?

System.Reflection.TargetException: L'objet ne correspond pas au type de cible.

Le cadre, je travaille avec (NUnit) exige que j'utiliser la réflexion pour exécuter, si je dois jouer dans les murs fournis. Je ne veux vraiment pas utiliser Emit pour créer des assemblys/modules/types/méthodes dynamiques juste pour exécuter un délégué que j'ai déjà.

Merci.

+0

Pouvez-vous ajouter le code qui génère l'exception? – dtb

+0

Le code est dans la structure NUnit, mais il échoue lorsque NUnit appelle la méthode Invoke sur MethodInfo. –

Répondre

2

Vous avez déjà obtenu la propriété Method. Vous aurez besoin de la propriété Target pour passer en tant que premier argument de MethodInfo.Invoke().

using System; 

class Program { 
    static void Main(string[] args) { 
     var t = new Test(); 
     Action a =() => t.SomeMethod(); 
     var method = a.Method; 
     method.Invoke(a.Target, null); 
    } 
} 

class Test { 
    public void SomeMethod() { 
     Console.WriteLine("Hello world"); 
    } 
} 
+0

Cela n'a pas fonctionné pour moi. Je soupçonne qu'il doit y avoir plus de choses dans les entrailles de NUnit. J'ai trouvé une solution de contournement, cependant kludgey il peut être. Ils ont rendu toutes les méthodes virtuelles, donc je lui passe le MethodInfo, mais remplace juste la méthode où il s'appelle, et appelle l'action directement. –

0

Il semble que les méthodes lambda, même lorsqu'elles sont déclarées dans un contexte statique, sont définies comme des méthodes d'instance.

Solution:

public static void MyMethodInvoker(MethodInfo method, object[] parameters) 
{ 
    if (method.IsStatic) 
     method.Invoke(null, parameters); 
    else 
     method.Invoke(Activator.CreateInstance(method.DeclaringType), parameters); 
} 
Questions connexes