c # замена методов и классов с помощью обобщений - PullRequest
0 голосов
/ 24 октября 2019

Это часть моего кода в классе (** включает в себя вещи, которые должны быть преобразованы в полимеры):

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;
  }

Я хочу назвать это возвращаемыми полученными заказами / клиентами и т. Д. (IEnumerable) на основена какой тип это. Если я сделаю копию класса и внесу изменения вручную, это сработает. Но я хочу использовать тот же базовый класс и просто использовать правильные замены в производном классе. Поэтому ShopifySharp.CustomerService и ShopifySharp.Customer должны быть заменены.

Я думаю, что дженерики - это путь, но бороться с этим. Таким образом, возвращаемый параметр должен быть изменен в зависимости от типа (Заказ / Клиент и т. Д.) И Сервиса (ShopifySharp.CustomerService), который будет ShopifySharp.OrderService в случае Заказа. И новый список (для ShopifySharp.Order) такой же, как в возвращаемом значении.

В этом случае у заказов и клиентов одинаковые методы. Так что ошибок там не будет. Я буду использовать то же самое в нескольких методах в классе, например, 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>();

Когда я хочу Order, тогда изменения будут:

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>();

Остальная часть кода останется неизменной, так как они имеют одинаковые свойства и методы.

1 Ответ

1 голос
/ 24 октября 2019

Возможно только некоторые универсальные параметры с новым ограничением

Новое ограничение указывает, что аргумент типа в объявлении универсального класса должен иметь открытыйконструктор без параметров. Чтобы использовать новое ограничение, тип не может быть абстрактным.

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()
{
    ...

Примечание : Очевидно, что вашему сервису также потребуется реализовать этот интерфейс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...