2010-04-05 5 views
7

Sto cercando di sviluppare un componente NUnit che aggiunge dinamicamente metodi di test a una suite da un oggetto che contiene un elenco di delegati Action. Il problema è che NUnit sembra appoggiarsi pesantemente alla riflessione per portare a termine il lavoro. Di conseguenza, sembra che non ci sia un modo semplice per aggiungere i miei Action direttamente alla suite.Come posso creare un MethodInfo da un delegato di Action

Devo, invece, aggiungere MethodInfo oggetti. Questo normalmente funzionerebbe, ma i delegati Action sono anonimi, quindi dovrei creare i tipi e i metodi per farlo. Devo trovare un modo più semplice per farlo, senza ricorrere all'utilizzo di Emit. Qualcuno sa come creare facilmente istanze MethodInfo dai delegati di Action?

risposta

10

Hai provato proprietà Metodo di azione? Voglio dire qualcosa come:

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

Scusa, non quello che volevi.

Nota che tutti i delegati sono multicast, quindi non è garantito che sia un MethodInfo univoco. Questo ti porterà tutti loro:

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

Stai perdendo le informazioni sugli oggetti di destinazione anche se (uncurrying il delegato), quindi non aspettatevi NUnit per essere in grado di chiamare con successo niente dopo.

+0

Questo produrrà un errore di compilazione ... – Aaronaught

+0

dispiace, pensavo di MethodInvoker quando ho visto MethodInfo. –

+0

+1 (per tornare a zero). A quanto pare, d.Method era tutto ciò di cui avevo bisogno. Funziona in NUnit, anche se la denominazione è funky. Dovrò creare la mia classe di test per risolvere il problema. –

3

Non è necessario "creare" un MethodInfo, si può solo recuperare dal delegato:

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

+1, tu e Fede entrambi avevano la risposta corretta. Ho accettato il suo, perché il legame va al ragazzo con due cifre in meno sul suo rappresentante. :) –