2014-06-18 9 views
6

Attualmente sto lavorando su un metodo di estensione che facilita il suggerimento del titolo della domanda.Il metodo più sicuro per richiamare MethodInfo dall'azione <T>'s Instance

Potrei, ovviamente. usa la chiamata al metodo GetMetohd ("Invoke") sul tipo e fallo con esso, Ma qualcosa mi dice che questo non è il modo "più sicuro" per andare. Classi e tipi possono cambiare, compresi quelli nel BCL.

Così mi è venuta in mente la seguente dichiarazione LINQ, che funziona bene:

public static class ActionExtensions 
{ 
    public static MethodInfo GetInvoke<T>(this Action<T> obj) 
    { 
     var actionType = obj.GetType(); 
     var tType= typeof(T); 

     return (
      from methodInfo 
      in actionType.GetMethods() 
      let par = methodInfo.GetParameters() 
      where par.Length == 1 && par[0].ParameterType == tType 
      select methodInfo 
      ).FirstOrDefault(); 
    } 
} 

La cosa è, anche questo si sente un po 'incerto, dal momento che uno giorno d'azione può cambiare e contenere un altro metodo con tale tratti .. anche se aggiungo il vincolo "HasGenericParameters", non c'è garanzia di sicurezza.

Avete idee per quanto riguarda un modo per ottenere l'esatto esempio MethodInfo rilevanti per

"Action<T>.Invoke()" 
+5

'L'azione ' ha già una proprietà .Method che restituisce MethodInfo per il metodo esatto dietro al delegato. –

+0

Cercando come richiamare un delegato usando emit di reflection (e presumo che lo si voglia) tutti sembrano dipendere da 'GetMethod (" Invoke ")'. Gli sviluppatori .NET non possono mai fare nulla per violare tutto questo codice. Penso che sia sicuro fare affidamento su questo. – usr

+0

geniale! grazie! @RexM –

risposta

5

A meno che non sto equivoco il tuo intento, tutto questo approccio sembra inutile. È possibile acquisire il MethodInfo per il metodo esatto dietro un delegato in questo modo:

Action<Foo> myAction = //get delegate... 
MethodInfo theMethod = myAction.Method; 

Se il Action<T> è avvolto intorno il metodo di un'istanza specifica, tale istanza è disponibile dalla proprietà myAction.Target.

+0

Penso che tu sia frainteso, ma che la tua risposta sia comunque utile. Penso che la domanda riguardi in particolare il metodo 'Action .Invoke'. Ma 'Azione myAction = _ => {}; myAction = new Action (myAction.Invoke); MethodInfo theMethod = myAction.Method; 'dovrebbe funzionare, ed è essenzialmente quello che hai già nella tua risposta. – hvd

+1

Questo è esattamente ciò di cui avevo bisogno! e nondimeno, penso che tu abbia capito chiaramente quello che stavo chiedendo, è solo la mia mancanza di esperienza con Action. –

+0

Rex M, FYI, Azione .Method restituisce un MethodInfo al metodo dell'oggetto sottostante, come in, l'istanza effettiva il cui Metodo I ha passato come Azione , se lo si desidera invocare utilizzando la reflection, avrebbe anche bisogno di mantenere attorno all'oggetto stesso riferimento, mentre nella mia implementazione con LINQ, avevo solo bisogno di mantenere il loro riferimento all'azione perché incapsulavano sia l'istanza che il metodo delegato. per i futuri googler. Riassumerò, methodInfo.Invoke (obj, param) con impl obj di Rex M sarebbe l'oggetto di cui è il metodo. nel mio caso, obj sarebbe l'azione riferimento stesso –

Problemi correlati