2010-02-08 1 views
8

Как определить, подходит ли MethodInfo к определенному типу делегирования?Проверка методаInfo по отношению к делегату

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; 
    } 
+0

Не могли бы вы перефразировать свой вопрос. Неясно, что вы хотите знать. – Steven

+0

это помогает? –

+0

Вы запрашиваете поддержку времени компиляции? – Steven

ответ

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

приятно. спасибо, именно то, что мне нужно. –