Использовать лямбду будет непросто - в конечном итоге это будет метод в другом классе, если он захватывает локальные переменные.Конечно, вы можете обнаружить это, но это не будет безопасным во время компиляции.
Аналогично, часть подписи интересна тем, что если это определенно и Action
, то делегатне имеет параметровВы не можете просто сделать параметр Delegate
, иначе преобразование группы методов не будет работать ... хотя вы все равно можете вызвать
myFoo.AddCallBack(new Action<int>(MyMethodName));
Альтернативой является создание нескольких перегрузок:
public static void AddCallback(this Foo foo, Action action)
public static void AddCallback<T>(this Foo foo, Action<T> action)
public static void AddCallback<T1, T2>(this Foo foo, Action<T1, T2> action)
Это не будет элегантно, но вам, вероятно, понадобится всего несколько штук по практическим соображениям.Если какой-либо метод возвращает значения, вам понадобятся аналогичные значения для Func
.
Существует дополнительная потенциальная проблема передачи делегата с несколькими действиями ... опять же, вы можете проверить это во время компиляции.Наконец, вы можете захотеть проверить, что Target
делегата совпадает с параметром foo
.
С этими проблемами, разработка сигнатуры составляет относительно просто.Вы используете свойство Delegate.Method
, и из него вы можете получить имя и типы параметров.Если для библиотеки требуется "int"
, а не "System.Int32"
и т. Д., Вам понадобится немного поработать над этим, но это не должно быть слишком плохо.(Хотя это звучит как довольно странный API.)