Я пытаюсь использовать универсальные c# для создания универсального c интерфейса, который служит основой для построения всех моих служб листинга. Однако у меня есть проблема с определением.
Базовые классы
abstract class ListingParams { }
abstract class ListingDTO<T> where T : ListingItemDTO
{
public List<T> Items{ get; set; }
}
abstract class ListingItemDTO { }
Конкретный пример
class HListingParams : ListingParams { }
class HListing : ListingDTO<HItem> { }
class HItem : ListingItemDTO { }
Интерфейс
interface IListingToolsService<in TFilter, out U, V>
where TFilter : ListingParams
where U : ListingDTO<V> where V : ListingItemDTO
{
int Count(TFilter parameters);
U Get(TFilter parameters);
}
Здесь начинается проблема, поскольку метод Get возвращает тип generi c, я должен добавить третий параметр c generi к интерфейсу.
Если я хочу создать конкретная реализация этого интерфейса, я должен создать что-то вроде этого:
class HListingToolsService : IListingToolsService<ListingParams, HListing, HItem>
{
public int Count(ListingParams parameters) => throw new NotImplementedException();
public HListing Get(ListingParams parameters) => throw new NotImplementedException();
}
Однако по определению HListing
не является обобщенным c, потому что он был определен с использованием HItem
.
Есть ли способ создать этот интерфейс только с двумя параметрами, чтобы не повторять уже определенный тип?