我有静态类充满扩展方法,其中每个方法都是异步的并返回一些值 - 像这样:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是能够从另一个类中的单个方法调用这些方法中的任何一个,并将其结果作为对象返回.它看起来像这样:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是演员表失败了.我的困境是我无法将任何类型参数传递给"InvokeContextExtension"方法,因为它是SignalR中心的一部分并由javascript调用.并且在某种程度上我不关心扩展方法的返回类型,因为它只是被序列化为JSON并被发送回javascript客户端.但是我必须将Invoke返回的值强制转换为任务才能使用await运算符.我必须提供一个带有"Task"的泛型参数,否则它会将返回类型视为void.所以这一切都归结为我如何成功地将具有泛型参数T的Task转换为具有对象的泛型参数的Task,其中T表示扩展方法的输出.