Async MethodInfo Invoke - 动态转换返回类型

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)

谢谢

jef*_*j23 5

非常感谢 Jon Skeet,他能够确定问题在于我让演员阵容过于具体。

var resultTask = (Task) cachableMethod.Invoke(...)  
Run Code Online (Sandbox Code Playgroud)

允许等待 MethodInfo 调用。