首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#使用泛型替换方法和类

c#使用泛型替换方法和类
EN

Stack Overflow用户
提问于 2019-10-24 10:29:53
回答 1查看 77关注 0票数 0

这是我在一个类中代码的一部分(**包含了需要进行多态的东西):

代码语言:javascript
复制
public async Task <IEnumerable<**ShopifySharp.Customer**>> GetListAsync(string URLShopify, string AccessToken, ListFilter Filter = null, int MaxReturns = 250)
  {

     var service = new **ShopifySharp.CustomerService**(URLShopify,AccessToken);
     var total = await service.CountAsync(Filter);

     var data = new List<**ShopifySharp.Customer**>();
 var pageOfData = await service.ListAsync(filter);
     data.AddRange(NewItem);
     return data;
  }

我想根据它的类型将其称为get Orders/Customers etc returned (IEnumerable)。如果我复制一个类并手动进行更改,它就能正常工作。但是我想使用相同的基类,并且只在派生类中使用正确的替换。因此,应该替换ShopifySharp.CustomerService和ShopifySharp.Customer。

我认为泛型是一条可行的道路,但要为此而苦苦挣扎。因此,返回参数必须根据类型( Order /Customer等)和服务(ShopifySharp.CustomerService)进行更改,在Order的情况下,它将是ShopifySharp.OrderService。并且新的列表(到ShopifySharp.Order)与返回值相同。

在这种情况下,Orders和Customer具有相同的方法。所以那里不会有错误。我将在类中的几个方法中使用相同的方法,例如Get和Update。

要清除,请执行以下操作:

当我想要客户时,那么更改将是:

代码语言:javascript
复制
public async Task <IEnumerable<ShopifySharp.Customer>> GetListAsync(string URLShopify, string AccessToken, ListFilter Filter = null, int MaxReturns = 250)

var service = new ShopifySharp.CustomerService(URLShopify,AccessToken);

var data = new List<ShopifySharp.Customer>();

当我想要订单时,更改将是:

代码语言:javascript
复制
public async Task <IEnumerable<ShopifySharp.Order>> GetListAsync(string URLShopify, string AccessToken, ListFilter Filter = null, int MaxReturns = 250)

var service = new ShopifySharp.OrderService(URLShopify,AccessToken);

var data = new List<ShopifySharp.Order>();

代码的其余部分将保持不变,因为它们具有相同的属性和方法。

EN

回答 1

Stack Overflow用户

发布于 2019-10-24 10:51:52

可能只是new constraint的一些通用参数

新约束指定泛型类声明中的类型参数必须具有公共无参数构造函数。若要使用新约束,该类型不能是抽象的。

代码语言:javascript
复制
public async Task<IEnumerable<TWhatType>> GetListAsync<TWhatType, TWhatService>(ListFilter filter = null)
   where   TWhatService : new()
{
   var service = new TWhatService();

   var total = await service.CountAsync(filter);
   var data = new List<TWhatType>();

   var pageOfData = await service.ListAsync(filter);

   data.AddRange(pageOfData);

   return data;
}

注意:由于CountAsyncListFilter,您还需要受基类或接口的约束,这些基类或接口支持您想要在服务中执行的任何操作的签名。

代码语言:javascript
复制
public interface ISomeService<T>
{
   Task<int> CountAsync(ListFilter filter = null);
   Task<IEnumerable<T>> ListAsync(ListFilter filter = null);
}

...

public async Task<IEnumerable<TWhatType>> GetListAsync<TWhatType, TWhatService>(ListFilter filter = null)
   where TWhatService : ISomeService<TWhatType>, new()
{
    ...

注意::显然,您的服务也需要实现此接口

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58533306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档