2010-04-05 18 views
7

Próbuję utworzyć dodatek NUnit, który dynamicznie dodaje metody testowania do zestawu z obiektu, który zawiera listę delegatów Action. Problem polega na tym, że wydaje się, że NUnit mocno opiera się na refleksji, aby wykonać zadanie. W związku z tym wygląda na to, że nie ma prostego sposobu na dodanie moich Action s bezpośrednio do pakietu.Jak utworzyć MethodInfo z delegata akcji

Muszę zamiast tego dodać obiekty MethodInfo. To normalnie by działało, ale delegaci Action są anonimowi, więc musiałbym zbudować typy i metody, aby to osiągnąć. Muszę znaleźć łatwiejszy sposób, aby to zrobić, bez uciekania się do korzystania z Emit. Czy ktoś wie, jak łatwo tworzyć instancje MethodInfo z delegatów akcji?

Odpowiedz

10

Czy próbowałeś właściwość metody działania jest? Mam na myśli coś takiego:

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

Przepraszam, nie to, co chciałeś.

Należy pamiętać, że wszyscy uczestnicy są rozsyłania grupowego, więc nie można zagwarantować, że będą unikatowi: MethodInfo. To pozwoli Ci uzyskać wszystkie z nich:

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; 
} 

Tracisz informacje o obiektach docelowych though (uncurrying delegata), więc nie należy się spodziewać, NUnit, aby móc z powodzeniem nazwać coś później.

+0

to będzie produkować błąd kompilacji ... – Aaronaught

+0

przepraszam, myślałem o MethodInvoker kiedy zobaczyłem MethodInfo. –

+0

+1 (aby wrócić do zera). Jak się okazało, d.Method był wszystkim, czego potrzebowałem. Działa w NUnit, chociaż nazywanie jest funky. Będę musiał stworzyć własną klasę testową, aby to naprawić. –

3

Nie trzeba „stworzyć” MethodInfo, można po prostu pobrać ją z delegatem:

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

+1, zarówno Ty, jak i Fede mieliście poprawną odpowiedź. Akceptowałem jego, ponieważ krawat idzie do faceta z dwoma mniej cyframi na jego przedstawicielu. :) –

Powiązane problemy