Это настолько хорошо, насколько это возможно, если использовать только общий интерфейс IHandler<T>
.
Чтобы изучить дополнительные параметры, мы можем определить неуниверсальную версию интерфейса:
public interface IHandler
{
void Handler(object myObject);
}
Тогда вы также можете определить общий абстрактный базовый класс, который реализует IHandler<T>
и IHandler
:
public abstract class BaseHandler<T> : IHandler, IHandler<T>
{
public abstract void Handle(T myObject);
void IHandler.Handle(object myObject)
{
((IHandler<T>)this).Handle((T) myObject);
}
}
В этот момент у вас может быть IDictionary<Type, IHandler>
, и вы можете напрямую вызвать IHandler.Handle
для значений, которые вы извлекаете из него:
var obj = /* whatever */
dictionary[obj.GetType()].Handle(obj);
С другой стороны, теперь у нас есть дополнительный интерфейс и абстрактный базовый класс, чтобы скрыть приведение от «пользовательского» кода, что не очень впечатляет.