2010-04-05 3 views
7

Я пытаюсь разработать дополнение NUnit, которое динамически добавляет методы тестирования в набор из объекта, который содержит список делегатов Action. Проблема в том, что NUnit, похоже, сильно опирается на размышления, чтобы выполнить свою работу. Следовательно, похоже, что нет простого способа добавить мой Action s непосредственно в пакет.Как я могу создать MethodInfo из делегата действия

Я должен, вместо этого, добавить MethodInfo объектов. Это нормально работает, но делегаты Action являются анонимными, поэтому мне придется создавать типы и методы для этого. Мне нужно найти более простой способ сделать это, не прибегая к использованию Emit. Кто-нибудь знает, как легко создавать экземпляры MethodInfo из делегатов Action?

ответ

10

Вы пробовали свойство методы действия в? Я имею в виду что-то вроде:

MethodInfo GetMI(Action a) 
{ 
    return a.Method; 
} 
1
MethodInvoker CvtActionToMI(Action d) 
{ 
    MethodInvoker converted = delegate { d(); }; 
    return converted; 
} 

Извините, не то, что вы хотели.

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

MethodInfo[] CvtActionToMIArray(Action d) 
{ 
    if (d == null) return new MethodInfo[0]; 
    Delegate[] targets = d.GetInvocationList(); 
    MethodInfo[] converted = new MethodInfo[targets.Length]; 
    for(int i = 0; i < targets.Length; ++i) converted[i] = targets[i].Method; 
    return converted; 
} 

Вы теряете информацию о целевых объектах, хотя (uncurrying делегат), поэтому я не ожидаю, NUnit, чтобы иметь возможность успешно называть что-либо после этого.

+0

это будет производить во время компиляции ошибки ... – Aaronaught

+0

извините, я думал о MethodInvoker, когда я увидел MethodInfo. –

+0

+1 (чтобы вернуть вас к нулю). Как выясняется, d.Method было всем, в чем я нуждался. Он работает в NUnit, хотя именование напуганно. Мне нужно создать собственный тестовый класс, чтобы исправить это. –

3

Вам не нужно «создать» MethodInfo, вы можете просто извлечь его из делегата:

Action action =() => Console.WriteLine("Hello world !"); 
MethodInfo method = action.Method 
+2

+1 У вас и Fede у обоих был правильный ответ. Я принял его, потому что галстук идет к парню с двумя меньшими цифрами на его репутации. :) –