Почему бы не перегрузить метод Add
?
public Foo Add(Foo f) { ... }
public Bar Add(Bar f) { ... }
public Baz Add(Baz f) { ... }
public Pony Add(Pony f) { ... }
Правильная перегрузка будет автоматически выбрана компилятором. Если объект передается в Add
, который не является Foo
, Bar
, Baz
или Pony
, компилятор выдаст ошибку. Это не будет правдой, если вы используете дженерики и напишите свою рассылку.
Если вы используете дженерики:
public T Add<T>(T obj) { ... }
Тогда компилятор позволит вам написать:
Add(new Widget());
, что приведет к исключению runtime . Это решение не рекомендуется. Вы ничего не получаете и теряете преимущества системы типов.
Относительно вашего редактирования:
Перегрузка Add для разных типов не является опцией, потому что класс реализует метод Add из интерфейса
Я рекомендую вам исправить этот интерфейс. Этот интерфейс поврежден и должен быть исправлен. Обобщения не должны использоваться для создания универсального метода, который выполняет диспетчеризацию только при исключении статической системы типов. Использование вами обобщений здесь ничем не отличается от простого использования object
в качестве типов возврата и параметров.
Если исправить этот интерфейс невозможно, перейдите к другому ответу.