Неудачная попытка красиво реализовать диспетчер вызовов по двум типам, чтобы был с использованием generic'ов и прочих вкусностей.
Небольшое пояснение: обычные виртуальные методы это диспетчер по одному типу. По двум типам можно сделать либо путем двойного вызова виртуальных методов (что не годится при неизвестном заранее количестве задействованных типов), либо путем регистрации методов в словаре с ключом по двум типам, и последующей выборки из него нужного метода. В данном проекте был реализован второй способ, ради большей расширяемости.