Приведение Task‹T› к T с использованием отражения

Используя атрибуты метода, я получаю IEnumerable<Delegate>. Я хочу позвонить каждому, сейчас я использую DynamicInvoke и получаю результат. Однако некоторые из методов могут быть async и возвращать Task чего-то. Мне все равно, что это такое, я просто хочу сериализовать это с помощью Newtonsoft.

Как я могу обрабатывать как синхронные, так и асинхронные методы?

Я думал проверить, реализует ли возвращаемый тип Task или Task<T>, но, поскольку я не знаю T, я не уверен, что это будет хороший способ сделать это.

Прямо сейчас мой код не поддерживает асинхронные методы и выглядит так:

protected string Invoke(Delegate method, params object[] args) {
   return JsonConvert.SerializeObject(method.DynamicInvoke(args));
}

protected void onRequest(Request request) {
   // Some logic
   Send(Invoke(request.Method, request.Arguments));
}

Методы выглядят следующим образом:

[RequestHandler("sell")]
private async Task<SellResponse> Sell(SellItemRequest request) {
   // Some asynchonous logic
   var response = new SellResponse {
      sucess = true,
      price = request.Price
   };
   return response;
}

[RequestHandler("buy")]
private BuyResponse Buy(BuyItemRequest request) {
   // Some logic
   var response = new {
      sucess = true,
      price = request.Price
   };
   return response;
}
...

person Hugo    schedule 03.06.2019    source источник
comment
можно посмотреть весь метод? :)   -  person jPhizzle    schedule 03.06.2019
comment
@jPhizzle Это чрезвычайно упрощенный код, но я добавлю в пример больше деталей.   -  person Hugo    schedule 03.06.2019
comment
также... JsonConvert.SerializeObject() возвращает строку.. поэтому Task‹строка› будет использоваться....   -  person jPhizzle    schedule 03.06.2019
comment
@jPhizzle: я думаю, что он имеет в виду, что args — это делегат, который может быть как синхронным, так и асинхронным.   -  person Robert Harvey    schedule 03.06.2019
comment
@RobertHarvey method может ссылаться, например, на Sell или Buy, один из которых является асинхронным, а другой — нет.   -  person Hugo    schedule 03.06.2019
comment
В какой-то момент в этом процессе должно быть что-то, что вызывает вызов либо синхронного, либо асинхронного метода. Можете ли вы принять решение там? Гораздо проще решить, что делать с возвращаемым значением метода, когда вы решите его вызвать, чем передавать метод, который может вернуть одно или совершенно другое, а затем пытаться выяснить, что возвращает метод. после того, как вы позвоните. Например, вместо передачи IEnumerable<Delegate> вызовите их, а затем передайте IEnumerable<WhateverTheyReturn>.   -  person Scott Hannen    schedule 03.06.2019
comment
@ScottHannen Я не могу, как видно из примера, они возвращают разные типы, некоторые ничего не возвращают. Иначе я бы не задавал этот вопрос.   -  person Hugo    schedule 03.06.2019
comment
хорошо, почему бы не сделать Buy() асинхронным методом? и любые другие методы, которые вы можете вызвать. сделать их все асинхронными, таким образом вы можете просто JsonConvert.SerializeObject(await method.DynamicInvoke(args));   -  person jPhizzle    schedule 03.06.2019
comment
@jPhizzle Я работаю над большим унаследованным проектом, просматриваю 20 файлов, и все их методы не проходят. Это также, скорее всего, будет критическим изменением.   -  person Hugo    schedule 03.06.2019