2010-02-08 66 views
8

如何確定MethodInfo是否適合不同的委託類型?根據委託檢查MethodInfo

bool IsMyDelegate(MethodInfo method); 

編輯: 我給一個MethodInfo對象,想知道它是否符合委託接口。 除了明顯

private bool IsValidationDelegate(MethodInfo method) 
    { 
     var result = false; 
     var parameters = method.GetParameters(); 
     if (parameters.Length == 2 && 
      parameters[0].ParameterType == typeof(MyObject1) && 
      parameters[1].ParameterType == typeof(MyObject2) && 
      method.ReturnType == typeof(bool)) 
     { 
      result = true; 
     } 
     else 
     { 
      m_Log.Error("Validator:IsValidationDelegate", "Method [...] is not a ValidationDelegate."); 
     } 
     return result; 
    } 
+0

您能否重新說明您的問題。目前還不清楚你想知道什麼。 – Steven 2010-02-08 11:11:50

+0

有幫助嗎? – 2010-02-08 11:15:08

+0

你是否要求編譯時支持? – Steven 2010-02-08 11:19:12

回答

11

如果method是一個靜態方法:

bool isMyDelegate = 
    (Delegate.CreateDelegate(typeof(MyDelegate), method, false) != null); 

如果method是一個實例方法:

bool isMyDelegate = 
    (Delegate.CreateDelegate(typeof(MyDelegate), someObj, method, false) != null) 

(不幸的是,你需要一個實例在這種情況下,因爲Delegate.CreateDelegate將嘗試綁定一個委託實例,即使在這種情況下我們關心它是否代表)

在這兩種情況下,訣竅基本上是要求.NET從MethodInfo創建所需類型的委託,但返回null而不是拋出異常,如果方法有錯誤的簽名。然後,對null進行測試告訴我們代理是否擁有正確的簽名。

請注意,因爲這實際上會嘗試創建委託,它也會爲您處理所有委託差異規則(例如,當方法返回類型兼容但與委託返回類型不完全相同時)。

+0

不錯。謝謝,正是我需要的。 – 2010-02-08 11:21:13