gpt4 book ai didi

c# - 创建使用通用参数的通用服务接口(interface)

转载 作者:行者123 更新时间:2023-12-04 10:11:27 25 4
gpt4 key购买 nike

我正在尝试使用 c# 泛型来创建一个通用接口(interface),作为构建我所有列表服务的基础。但是我对定义有疑问。

基类

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方法返回的是泛型类型,我必须在接口(interface)中添加第三个泛型参数。

如果我想创建该接口(interface)的具体实现,我必须创建如下内容:
class HListingToolsService : IListingToolsService<ListingParams, HListing, HItem>
{
public int Count(ListingParams parameters) => throw new NotImplementedException();
public HListing Get(ListingParams parameters) => throw new NotImplementedException();
}

但是根据定义 HListing不是通用的,因为它是使用 HItem 定义的.

有没有办法只用两个参数创建该接口(interface),以免重复已经定义的类型?

最佳答案

您可以稍微更改您的代码,转换 ListingDTO<T>接口(interface)和制作泛型类型参数T协变的。在这种情况下,您还应该更改 Items输入 IEnumerable<T> , 自 List<T>是不变的。

interface IListingDTO<out T> where T : ListingItemDTO
{
public IEnumerable<T> Items { get; }
}

然后在 HListing 中实现类(class)

class HListing : IListingDTO<HItem>
{
public IEnumerable<HItem> Items { get; }
}

之后您可以更新 IListingToolsService界面并摆脱 V泛型类型参数及其约束

interface IListingToolsService<in TFilter, out U>
where TFilter : ListingParams
where U : IListingDTO<ListingItemDTO>
{
int Count(TFilter parameters);

U Get(TFilter parameters);
}

最后实现 HListingToolsService类(class)

class HListingToolsService : IListingToolsService<ListingParams, HListing>
{
public int Count(ListingParams parameters) => throw new NotImplementedException();
public HListing Get(ListingParams parameters) => throw new NotImplementedException();
}
IListingDTO<out T> 的协变声明允许您使用 HListing (实现此接口(interface))在服务实现中

关于c# - 创建使用通用参数的通用服务接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61320941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com