Приведение Задачи <T>к T с использованием отражения - PullRequest
0 голосов
/ 03 июня 2019

Используя атрибуты метода, я получаю 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;
}
...
...