jef*_*j23 1 c# expression asynchronous system.reflection
我试图通过 MethodInfo 调用调用一个可等待的方法。
MethodInfo.Invoke() 返回类型对象,在我可以等待它之前需要将其转换为任务。如果我使用 Task 的泛型参数手动转换返回类型,则该过程可以正常工作。
但是,我可以调用许多具有不同返回类型的方法。我如何处理返回类型?
public class Repository
{
public IEnumerable<Foo> GetListAsync(int criteria)
{
return new List<Foo> {new Foo {Bar = "1"}, new Foo {Bar = "2"}};
}
}
public class Foo
{
public string Bar { get; set; }
}
public class Precache
{
public static void RegisterPreCache(Repository instanceObject)
{
var preCachedType = typeof (Repository);
var preCachableMethods =
preCachedType
.GetMethods();
foreach (var cachableMethod in preCachableMethods)
{
var resultTask =
(Task<IEnumerable<Foo>>) cachableMethod.Invoke(instanceObject,
new object[]
{1});
Task.Run(async () => await resultTask).Wait();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以从 cacheableMethod.ReturnType 属性中轻松获取返回类型。我怎样才能动态地进行演员表?没有演员表,我无法等待召唤。
我试过简单地将其转换为 Task ,这当然不起作用(编辑:它确实有效)。我已经尝试将所有参数传递到一个新的泛型方法中,但是如果我没有指定泛型类型必须是 Task(其中 T : Task),我会收到一个编译时错误,即没有 GetAwaiter 的定义。
private static void CallExpression<T>(T returnType, MethodInfo
cachableMethod, object instanceObject, object[] parameters)
{
var resultTask = (T) cachableMethod.Invoke(instanceObject, parameters);
Task.Run(async () => await resultTask).Wait();
}
Run Code Online (Sandbox Code Playgroud)
谢谢
非常感谢 Jon Skeet,他能够确定问题在于我让演员阵容过于具体。
var resultTask = (Task) cachableMethod.Invoke(...)
Run Code Online (Sandbox Code Playgroud)
允许等待 MethodInfo 调用。