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