Проверка MethodInfo для делегата - PullRequest
8 голосов
/ 08 февраля 2010

Как определить, соответствует ли MethodInfo отдельному типу делегата?

bool IsMyDelegate(MethodInfo method);

Edit: Я получил объект 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 Ответ

11 голосов
/ 08 февраля 2010

Если 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, но вернуть нулевое значение, а не выдавать исключение, если метод имеет неправильную сигнатуру. Затем проверка на ноль говорит нам, была ли у делегата правильная подпись или нет.

Обратите внимание, что поскольку он действительно пытается создать делегат, он также будет обрабатывать все правила отклонения делегата для вас (например, когда тип возвращаемого значения метода совместим, но не совсем совпадает с типом возвращаемого значения делегата).

...