Ваш вопрос довольно общий. Тем не менее, я думаю, что вы можете использовать некоторый общий тип делегата, а затем просто обернуть вызов метода final в простое лямбда-выражение, чтобы соответствующим образом преобразовать параметры.
Например, допустим, у вас есть событие, которое запускается с двумя строками в качестве аргумента. Это может быть создано с помощью делегата Action<string, string>
из .NET 3.5. Тогда у вас будет два метода, которые вы хотите вызвать (и вам нужно будет выбирать между ними динамически):
void Foo(int n, string s) { /* expects int as the first parameter */ }
void Bar(string concatenated) { /* expects concatenated string */ }
Затем вы можете создать двух делегатов действий, таких как:
// Converts parameter to int and calls 'Foo'
Action<string, string> callFoo = (s1, s2) => Foo(Int32.Parse(s1), s2);
// Concatenates parameters and calls 'Bar'
Action<string, string> callBar = (s1, s2) => Bar(s1 + ", " + s2);
Код в лямбда-выражениях служит простым адаптером, который преобразует фактические параметры в параметры, ожидаемые методом. Теперь вы можете динамически добавлять / удалять callFoo
и callBar
в качестве обработчиков события, которое вы хотите обработать.