2014-06-18 7 views
6

Ich arbeite zZ an einer Erweiterungsmethode, die erleichtert, was der Titel der Frage vorschlägt.Sicherste Methode, die Invoke MethodInfo von der Instanz der Aktion <T> zu erhalten

könnte ich natürlich. Verwenden Sie den GetMetohd ("Invoke") Methodenaufruf auf den Typ und damit fertig sein, Aber etwas sagt mir, das ist nicht der "sicherste" Weg zu gehen. Klassen und Typen können sich ändern, einschließlich derer in der BCL.

Also habe ich mit der folgenden LINQ-Anweisung kommen, die ganz gut funktioniert:

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

Die Sache ist, auch diese etwas zweifelhaft empfindet, seit dem ersten Tag Aktion kann ein anderes Verfahren mit einem solchen ändern und enthalten Eigenschaften .. selbst wenn ich die Einschränkung "HasGenericParameters" hinzufüge, gibt es keine Sicherheit.

Haben Sie irgendwelche Ideen haben, einen Weg in Bezug auf die genaue Method Instanz relevant

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

'Aktion ' hat eine .Method -Eigenschaft bereits, die MethodInfo für genau diese Methode hinter dem Delegaten zurückgibt. –

+0

Suchen nach, wie man einen Delegaten mit Reflektionsemblem aufruft (und ich nehme an, dass Sie das wollen), jeder scheint sich auf 'GetMethod (" Invoke ")' zu verlassen. Die .NET-Entwickler können nie etwas tun, um den ganzen Code zu brechen. Ich denke, darauf kann man sich verlassen. – usr

+0

brilliant! Danke! @ RexM –

Antwort

5

Wenn ich nicht Ihre Absicht bin Missverständnis zu erhalten, dieser ganze Ansatz scheint überflüssig. Sie können wie so die Method für die genaue Methode hinter einem Delegierten erwerben:

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

Wenn die Action<T> um eine bestimmte Instanz des Verfahrens gewickelt ist, dass beispielsweise von der myAction.Target Eigenschaft zur Verfügung steht.

+0

Ich denke, du bist ein Missverständnis, aber deine Antwort ist trotzdem nützlich. Ich denke, die Frage bezieht sich speziell auf die "Aktion .Invoke" -Methode. Aber 'Aktion myAction = _ => {}; myAction = new Aktion (myAction.Invoke); MethodInfo theMethod = myAction.Method; 'sollte funktionieren und ist im Wesentlichen das, was Sie bereits in Ihrer Antwort haben. – hvd

+1

Genau das habe ich gebraucht! Und trotzdem, ich denke, du hast klar verstanden, was ich gefragt habe, es ist nur meine mangelnde Erfahrung mit Action. –

+0

Rex M, FYI, Aktion .Method gibt eine MethodInfo an die zugrunde liegende Objektmethode zurück, wie in der tatsächlichen Instanz, deren Methode ich als Aktion übergeben habe, wenn man sie über Reflektion aufrufen möchte, müsste er auch behalten Um die Objektreferenz herum, während ich in meiner Implementierung mit LINQ, musste ich nur ihre Aktion Verweis um, weil sie sowohl Instanz und Methode delegieren gekapselt. für zukünftige Googler. Ich fasse zusammen, methodInfo.Invoke (obj, param) mit Rex M's impl obj wäre das Objekt, dessen Methode es ist. in meinem Fall wäre obj die Aktion Referenz selbst –