Добрый день.
Пишу асинхронную сетевую библиотеку, в которой есть несколько вариантов возвращаемых пакетов:
BasicStatisticResponse,
FullStatisticResponse. Все пакеты реализуют общий интерфейс
IResponse.
Соответственно, для каждого типа ответа есть свой метод запроса
public async Task<ServerBasicStateResponse> GetBasicStatus(Server server);
public async Task<ServerFullStateResponse> GetFullStatus(Server server);
Проблема возникает в тот момент, когда мы хотим хранить работающие таски в одном списке
List<Task<IResponse>> requests
для последующего использования в
Task.WaitAll(requests)
.
List<Task<IResponse>> serversStatisticRequests = new();
foreach(Server server in servers)
{
serversStatisticRequests.Add(service.GetBasicStatus(server));
serversStatisticRequests.Add(service.GetFullStatus(server));
}
Ругается на то, что
Task<ServerBasicStateResponse>
и
Task<FullStatisticResponse>
невозможно привести к
Task<IResponse>
.
Что с этим можно сделать?
Выделять базовый класс при наличии интерфейса не хотелось бы.
Возвращать значение из обоих методов в виде IResponse - тоже: мы ведь не обязательно будем всегда пихать всё в кучу. При использовании нам могут понадобится запросы только какого-то конкретного типа, и не хотелось бы каждый раз приводить их результаты к нужному типу: мы ведь ожидаем, что библиотека сама знает, какой тип ответа приходит на какой тип запроса.