Давайте предположим следующий граф наследования:
A <-B <-C <-D <-E <-... (дерево наследования на самом деле более сложное, чем в этом примере, и содержит сотнифактических типов).<strong> Я не владею этими типами и не контролирую их реализацию
Давайте также предположим набор статических методов:
Handle (A a), Дескриптор (B b), дескриптор (C c), дескриптор (D d) и т. Д.
Моя текущая реализация дескриптора (A a) «отправляет» требуемый метод с помощью dynamic
ключевое слово:
public static void Handle(A a)
{
Handle((dynamic)a);
}
public static void Handle(B b)
{
//B specific processing
}
//And so on
Хост-приложение отправляет мне объекты в A[]
, хотя каждый объект может иметь свой тип времени выполнения.В сущности, меня даже не интересуют объекты типа A
.
. Мне нужны разные методы Handle
, потому что обработка, которую хочет выполнить клиент, отличается в зависимости от типа времени выполнения объектов.
Моя реализация работает очень хорошо до тех пор, пока в моем коде есть метод Handle
с соответствующей сигнатурой для типа времени выполнения объектов, в которые я передан, но, как это происходит сейчас, когдапередается объект, который не имеет определенного метода Handle
, метод Handle(A a)
вызывается рекурсивно, вызывая переполнение стека.
Я, очевидно, не могу определить метод Handle(X x)
для каждого из стаили около того типов, которые я мог бы передать из хост-приложения, и каждая последующая версия API этого хост-приложения может определять новые типы.
Поэтому мой вопрос заключается в том, как обрабатывать типы, у которых нет определенного Handle
метод без необходимости делать бесконечную серию операторов if
или даже длинную инструкцию switch
для фильтрации объектов, для которых я надеваюу вас нет метода-обработчика?
Есть ли способ во время выполнения определить, существует ли на самом деле метод Handle
для типа времени выполнения переданного объекта?Или есть другие способы аккуратно обработать «недостающие» методы?
Любые идеи / рекомендации приветствуются.