我试图通过MethodInfo invoke调用一个可等待的方法。
MethodInfo.Invoke()返回类型对象,在等待它之前需要将其转换为Task。如果我使用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();
}
}
}
我可以很容易地从cacheableMethod获得返回类型。ReturnType财产。我如何动态地进行强制转换?没有强制类型转换,就不能等待调用。
我试过简单地铸造任务,当然不工作(编辑:它确实工作)。我已经尝试将所有参数传递到一个新的泛型方法中,但是如果我没有指定泛型类型必须是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();
}
谢谢
非常感谢Jon Skeet,他能够确定问题是我把演员阵容弄得太具体了。
var resultTask = (Task) cachableMethod.Invoke(...)
允许等待MethodInfo调用
答案已经发布了:
var resultTask = (Task)cachableMethod.Invoke(...)
但是,要注意:
- 你可以等待
Task
和Task<T>
之外的任何东西,所以如果你的下游方法返回的东西可以等待扩展方法,这种方法将不起作用。 - 问题1可能是未来c# 7功能的问题,在那里你可以在异步方法中返回自定义的可等待类型,除了
Task
或Task<T>