8

如何确定 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;
    }
4

1 回答 1

12

如果method是静态方法:

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

Ifmethod是一个实例方法:

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

(不幸的是,在这种情况下您需要一个实例,因为 Delegate.CreateDelegate 将尝试绑定一个委托实例,即使在这种情况下我们只关心它是否可以创建委托

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

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

于 2010-02-08T11:17:49.490 回答