Как мне вызвать MethodInfo, который был создан из анонимного метода?
В предыдущем вопросе я спросил, как получить MethodInfo
от делегата Акции. Этот делегат действия был создан анонимно (из лямбды). У меня сейчас проблема в том, что я не могу вызвать MethodInfo
потому что это требует объекта, к которому MethodInfo
принадлежит. В этом случае, поскольку делегаты являются анонимными, нет владельца. Я получаю следующее исключение:
System.Reflection.TargetException: объект не соответствует целевому типу.
Фреймворк, с которым я работаю (NUnit), требует, чтобы я использовал Reflection для выполнения, поэтому я должен играть в предоставленных стенах. Я действительно не хочу прибегать к использованию Emit
создавать динамические сборки / модули / типы / методы просто для выполнения делегата, который у меня уже есть.
Благодарю.
2 ответа
Вы уже получили свойство Method. Вам потребуется свойство Target для передачи в качестве 1-го аргумента в 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");
}
}
Похоже, что лямбда-методы, даже если они объявлены в статическом контексте, определены как методы экземпляра.
Решение:
public static void MyMethodInvoker( MethodInfo method, object[] parameters )
{
if ( method.IsStatic )
method.Invoke( null, parameters );
else
method.Invoke( Activator.CreateInstance( method.DeclaringType ), parameters );
}