Async MethodInfo调用-动态转换返回类型



我试图通过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(...)  

但是,要注意:

  1. 你可以等待TaskTask<T>之外的任何东西,所以如果你的下游方法返回的东西可以等待扩展方法,这种方法将不起作用。
  2. 问题1可能是未来c# 7功能的问题,在那里你可以在异步方法中返回自定义的可等待类型,除了TaskTask<T>

最新更新