Как мне вызвать MethodInfo, который был создан из анонимного метода? - PullRequest
1 голос
/ 07 апреля 2010

В предыдущем предыдущем вопросе я спросил, как получить MethodInfo от делегата Action. Этот делегат действия был создан анонимно (из лямбды). У меня сейчас проблема в том, что я не могу вызвать MethodInfo, потому что для этого требуется объект, которому принадлежит MethodInfo. В этом случае, поскольку делегаты являются анонимными, нет владельца. Я получаю следующее исключение:

System.Reflection.TargetException: объект не соответствует типу цели.

Фреймворк, с которым я работаю (NUnit), требует, чтобы я использовал Reflection для выполнения, поэтому я должен играть в предоставленных стенах. Я действительно не хочу прибегать к использованию Emit для создания динамических сборок / модулей / типов / методов просто для выполнения делегата, который у меня уже есть.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2010

Вы уже получили свойство Method. Вам понадобится свойство Target для передачи в качестве первого аргумента в 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 голосов
/ 17 марта 2017

Похоже, что лямбда-методы, даже если они объявлены в статическом контексте, определены как методы экземпляра.

Решение:

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