代码之家  ›  专栏  ›  技术社区  ›  Sven Hecht

根据委托检查MethodInfo

  •  8
  • Sven Hecht  · 技术社区  · 16 年前

    如何确定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;
        }
    
    1 回复  |  直到 16 年前
        1
  •  11
  •   itowlson    16 年前

    如果 method 是静态方法:

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

    如果 方法 是实例方法:

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

    (不幸的是,在这种情况下,您需要一个实例,因为delegate.createDelegate将尝试绑定一个委托实例,尽管在这种情况下,我们只关心它是否 能够 是否创建。)

    在这两种情况下,技巧基本上都是要求.NET从MethodInfo创建所需类型的委托,但如果方法的签名错误,则返回空值而不是引发异常。然后,对空值的测试告诉我们委托是否具有正确的签名。

    请注意,因为这实际上试图创建委托,所以它还将为您处理所有委托差异规则(例如,当方法返回类型兼容但与委托返回类型不完全相同时)。

    推荐文章