2014-06-18 17 views
6

獲取調用MethodInfo最安全的方法我目前正在研究一個擴展方法,以促進問題的標題建議。從行動<T>的實例

我當然可以。對該類型使用GetMetohd(「Invoke」)方法調用並使用它, 但是有些東西告訴我這不是最「安全」的方式。 類別和類型可能會發生變化,包括BCL中的類型和類型。

所以我想出了下面的LINQ語句,它工作得很好:

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

的事情是,即使這種感覺有點玄乎,從一次開始的行動可以改變並且包含這樣的一種方法性狀......即使我添加「HasGenericParameters」約束,也沒有安全保證。

你有關於一種方式來獲得相關的準確的MethodInfo實例的任何想法

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

'Action '有一個.Method屬性,它已經返回MethodInfo對於委託後面的確切方法。 –

+0

尋找如何使用反射發射調用委託(我假設你想這樣)每個人似乎都依賴'GetMethod(「Invoke」)'。 .NET開發人員無法做任何事情來破壞所有這些代碼。我認爲依靠這一點是安全的。 – usr

+0

輝煌!謝謝! @RexM –

回答

5

除非我誤解你的意圖,這整個的做法似乎沒有必要。您可以獲取MethodInfo的一個代表背後的具體方法如下所示:

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

如果Action<T>是圍繞一個特定實例的方法包裝,該實例可從myAction.Target財產。

+0

我認爲你是誤會,但你的答案是有用的。我認爲這個問題具體是關於'Action .Invoke'方法。但'行動 myAction = _ => {}; myAction = new Action (myAction.Invoke); MethodInfo theMethod = myAction.Method;'應該可以工作,而且基本上你已經在你的答案中有了。 – hvd

+1

這正是我需要的!儘管如此,我認爲你清楚地明白我在問什麼,這只是我缺乏Action的經驗。 –

+0

Rex M,FYI,Action 。方法返回一個MethodInfo對象的底層對象的方法,如實例中我的方法I作爲Action 傳遞,如果有人想用反射調用它,他也需要保留圍繞着對象引用本身,而在我用LINQ實現時,我只需要保留它們的Action參考,因爲它們封裝了實例和方法委託。爲未來的谷歌。我將總結一下, methodInfo.Invoke(obj,param)與Rex M的impl obj將是其方法的對象。在我的情況下,OBJ將是行動參考本身 –