我有一个静态类,其中包含许多扩展方法,每个方法都是异步的并返回一些值 - 就像这样:
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返回的值强制转换为一个Task,以便使用await运算符。我必须提供一个泛型参数与该“Task”,否则它将把返回类型视为void。所以问题就在于如何成功地将带有泛型参数T的Task强制转换为带有对象泛型参数的Task,其中T表示扩展方法的输出。
Task
呢?反正你最终仍需使用反射来获取结果。或者编写一些方法,为你掩盖这些差异:async Task<object> GetResult<TResult>(Task<TResult> task) { return await task; }
- ta.speot.is