Задать вопрос
MaxLevs
@MaxLevs

Как привести набор Task с разными возвращаемыми результатами к набору Task с результатами в виде общего интерфейса?

Добрый день.

Пишу асинхронную сетевую библиотеку, в которой есть несколько вариантов возвращаемых пакетов: BasicStatisticResponse, FullStatisticResponse. Все пакеты реализуют общий интерфейс IResponse.

Responses class diagram

615d657700f70688520771.png


Соответственно, для каждого типа ответа есть свой метод запроса
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 - тоже: мы ведь не обязательно будем всегда пихать всё в кучу. При использовании нам могут понадобится запросы только какого-то конкретного типа, и не хотелось бы каждый раз приводить их результаты к нужному типу: мы ведь ожидаем, что библиотека сама знает, какой тип ответа приходит на какой тип запроса.
  • Вопрос задан
  • 50 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Можно закостылить примерно так:
serversStatisticRequests.Add(service.GetBasicStatus(server).ContinueWith(x => (IResponse) x.Result));
serversStatisticRequests.Add(service.GetFullStatus(server).ContinueWith(x => (IResponse) x.Result));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы