2010-02-08 69 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