После редактирования двух классов, не наследующих один и тот же интерфейс, ответом будет использование одного из следующих:
- Отражение
- Динамический
Ни один из них, конечно, не проверит, что метод существует до времени выполнения, но я думаю, что это как бы подразумевается в вопросе.
Учитывая следующие два класса A и B, которые содержат метод с той же сигнатурой, но не реализуют тот же интерфейс:
class A
public void Handle(string s) {
Console.WriteLine("Hello from A: " + s);
}
}
и:
class B
public void Handle(string s) {
Console.WriteLine("Hello from B: " + s);
}
}
Вы можете создать метод, который обрабатывает любой объект, имеющийметод с такой сигнатурой, например:
static void HandleObject(dynamic anything) {
anything.Handle("It works!");
}
HandleObject будет в основном принимать любой объект в качестве входных данных, и во время выполнения попытаться слепо вызвать метод с именем Handle
для него.Если у объекта нет Handle
метода, вызов не будет выполнен во время выполнения.
Компилятор не помогает (или не останавливает) вас в динамике.Отказы откладываются до времени выполнения:)