У меня есть статический класс, полный методов расширения, где каждый из методов является асинхронным и возвращает некоторое значение - например:
public static class MyContextExtensions{
public static async Task<bool> SomeFunction(this DbContext myContext){
bool output = false;
//...doing stuff with myContext
return output;
}
public static async Task<List<string>> SomeOtherFunction(this DbContext myContext){
List<string> output = new List<string>();
//...doing stuff with myContext
return output;
}
}
Моя цель состоит в том, чтобы иметь возможность вызывать любой из этих методов из одного метода в другом классе и возвращать их результат как объект. Он будет выглядеть примерно так:
public class MyHub: Hub{
public async Task<object> InvokeContextExtension(string methodName){
using(var context = new DbContext()){
//This fails because of invalid cast
return await (Task<object>)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context);
}
}
}
Проблема заключается в том, что сбой не выполняется. Моя дилемма заключается в том, что я не могу передавать какие-либо параметры типа в метод "InvokeContextExtension", потому что он является частью концентратора SignalR и вызывается javascript. И в какой-то степени мне не нужен тип возврата метода расширения, потому что он просто собирается сериализоваться в JSON и отправляется обратно на javascript-клиент. Однако мне нужно указать значение, возвращаемое Invoke как задачу, чтобы использовать оператор ожидания. И я должен предоставить общий параметр этой "Задачей", иначе он будет обрабатывать возвращаемый тип как void. Таким образом, все сводится к тому, как успешно передать задачу с общим параметром T в задачу с общим параметром объекта, где T представляет собой вывод метода расширения.