这是我在一个类中代码的一部分(**包含了需要进行多态的东西):
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。
要清除,请执行以下操作:
当我想要客户时,那么更改将是:
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>();当我想要订单时,更改将是:
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>();代码的其余部分将保持不变,因为它们具有相同的属性和方法。
发布于 2019-10-24 10:51:52
可能只是new constraint的一些通用参数
新约束指定泛型类声明中的类型参数必须具有公共无参数构造函数。若要使用新约束,该类型不能是抽象的。
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;
}注意:由于CountAsync和ListFilter,您还需要受基类或接口的约束,这些基类或接口支持您想要在服务中执行的任何操作的签名。
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()
{
...注意::显然,您的服务也需要实现此接口
https://stackoverflow.com/questions/58533306
复制相似问题