2010-04-05 15 views
7

Estoy tratando de desarrollar un complemento NUnit que agregue dinámicamente métodos de prueba a un conjunto desde un objeto que contiene una lista de delegados Action. El problema es que NUnit parece apoyarse mucho en la reflexión para hacer el trabajo. En consecuencia, parece que no hay una manera simple de agregar mi Action s directamente al conjunto.Cómo puedo crear un MethodInfo desde un delegado de Acción

Debo, en cambio, agregar MethodInfo objetos. Esto normalmente funcionaría, pero los delegados de Action son anónimos, por lo que tendría que crear los tipos y métodos para lograr esto. Necesito encontrar una manera más fácil de hacerlo, sin recurrir al uso de Emit. ¿Alguien sabe cómo crear instancias de MethodInfo fácilmente desde los delegados de Acción?

Respuesta

10

Ha intentado propiedad Método de Acción? Me refiero a algo como:

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

Lo siento, no es lo que quería.

Tenga en cuenta que todos los delegados son multidifusión, por lo que no se garantiza que sea un único MethodInfo. Esto le dará todas ellas:

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

Estás perdiendo la información sobre los objetos de destino, aunque (uncurrying el delegado), así que no esperamos que NUnit para poder llamar con éxito nada después.

+0

Esto producirá un error en tiempo de compilación ... – Aaronaught

+0

lo siento, yo estaba pensando en MethodInvoker cuando vi MethodInfo. –

+0

+1 (para volver a cero). Como resultado, d.Method era todo lo que necesitaba. Funciona en NUnit, aunque el nombre es funky. Tendré que crear mi propia clase de prueba para arreglar eso. –

3

No es necesario "crear" un MethodInfo, sólo puede recuperarla desde el delegado:

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

+1, tanto usted como Fede tuvieron la respuesta correcta. Acepté el suyo, porque la corbata va para el tipo con dos dígitos menos en su representante. :) –

Cuestiones relacionadas