Можно ли объявить универсальную коллекцию для хранения только объектов, реализующих универсальный интерфейс с любым <T>
?
Мой вопрос сводится к следующему: если я хочу/должен хранить объекты, реализующие универсальный интерфейс, есть ли лучший способ выразить этот факт, чем использовать неуниверсальную коллекцию или (общий из <Object>
).
Пример:
// An example Generic Interface
interface ISyncInterface<T>
{
Task DoSync();
IEnumerable<T> NewItems { get; }
}
// a manager-class that registers different classes implementing
// the generic interface.
// The code works - can it be done better?
class Manager
{
private List<Object> _services = new List<Object>(); // <- works but is basically non generic
// however the RegisterService() ensures that only correct types can be added.
// would like to have something like below to indicate the Interface-Type
// however: this would only allow _services2.Add to hold types of ISyncInterface<Object>
// - ISyncInterface<ServiceA_DTO> would fail.
private List<ISyncInterface<Object>> _services2 = new List<ISyncInterface<Object>>();
void RegisterService<T, U>(T service)
where T : ISyncInterface<U>
{
_services.Add(service); // <- works e.g. for SyncServiceA
// _services2.Add(service); // <- FAILS for SyncServiceA - no conversion
// _services2.Add((ISyncInterface<Object>) service); // <- FAILS also - no explicit cast
}
}
// SETUP - The classes used above. Just to clarify.
class ServiceA_DTO { }
class ServiceB_DTO { }
class SyncServiceA : ISyncInterface<ServiceA_DTO>
{
public Task DoSync() {}
public IEnumerable<ServiceA_DTO> NewItems { get; }
}
class SyncServiceB : ISyncInterface<ServiceB_DTO>
{
public Task DoSync() {}
public IEnumerable<ServiceB_DTO> NewItems { get; }
}
Это вообще возможно? Любой совет высоко ценится!
Обновление: новый, более подробный код для прояснения проблемы.
Ниже было предложение создать общий интерфейс на основе не общего. Но, как следствие, все реализующие классы универсального интерфейса должны будут реализовать неуниверсальные методы, свойства и т. д. - или есть способ обойти это?
Спасибо за ваш вклад!
MyInterface<T>
? Возможно, вы сможете сделать его ковариантным вT
, тогда вы сможете создатьList<MyInterface<object>>
. - person Lee   schedule 19.03.2019MyInterface<T>
, гдеT
отличается, является другим классом — думайте о них как оMyInterfaceInt
иMyInterfaceString
. Как бы вы создали класс, который может справиться с этим? Экземпляры универсальных классов совместно используют реализацию, а не иерархию типов. - person NetMage   schedule 19.03.2019