Как мне вызвать 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 );
}
Другие вопросы по тегам