Другой способ, о котором я упоминал, упомянутый tvanfosson, - сделать ваш класс IDoStuffToInterface универсальным. Это также хорошо работает, если (как показано в примере) объект TheInterface передается в конструктор и (предположительно) сохраняется в классе.
Однако, если бы это была просто функция (или даже конструктор), которая использует TheInterface, и она не сохраняется в классе , вероятно, было бы лучше сделать саму функцию универсальной и оставить класс в покое. Например:
public class IDoStuffToInterface
{
public void DoSomething<T>(TheInterface<T> theInterface) where T : IObject
{
//bla bla
}
}
Это позволит вам сделать следующее:
ClassThatWorksWithSomeObject myObject = new ClassThatWorksWithSomeObject();
IDoStuffToInterface actor = new IDoStuffToInterface();
actor.DoSomething(myObject);
Это компилируется без каких-либо проблем, потому что компилятор может определить по выводу, что вы на самом деле вызываете
actor.DoSomething<SomeObject>(myObject);
Теперь я думаю, что использование ковариации все еще, вероятно, лучший вариант, если вы контролируете определение интерфейса. Но я хотел добавить это как еще один вариант, когда у вас нет такого уровня контроля в вашем интерфейсе.