2010-04-07 7 views
1

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

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

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

Спасибо.

+0

Вы можете добавить код, который генерирует исключение? – dtb

+0

Код в структуре NUnit, но он не работает, когда NUnit выполняет вызов метода Invoke в MethodInfo. –

ответ

2

У вас уже есть свойство 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

Это не сработало для меня. Я подозреваю, что во внутренностях NUnit должно быть больше. Я нашел обходное решение, однако, как бы это ни было. Они сделали все методы виртуальными, поэтому я передаю ему MethodInfo, но просто переопределяю метод, в котором он вызван, и вызываем действие непосредственно. –

0

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

Решение:

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

 Смежные вопросы

  • Нет связанных вопросов^_^