Используя атрибуты метода, я получаю 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;
}
...
args
— это делегат, который может быть как синхронным, так и асинхронным. - person Robert Harvey   schedule 03.06.2019method
может ссылаться, например, наSell
илиBuy
, один из которых является асинхронным, а другой — нет. - person Hugo   schedule 03.06.2019IEnumerable<Delegate>
вызовите их, а затем передайтеIEnumerable<WhateverTheyReturn>
. - person Scott Hannen   schedule 03.06.2019JsonConvert.SerializeObject(await method.DynamicInvoke(args));
- person jPhizzle   schedule 03.06.2019