如何在不使用动力学的情况下调用异步方法并获取结果

时间:2018-09-21 15:04:26

标签: c# reflection async-await

如何在不使用动力学的情况下调用异步方法并返回结果

我想用反射调用异步方法。我发现有两种方法可以做到这一点

await (Task) objType.GetTypeInfo()
                    .GetDeclaredMethod("ThePrivateMethod")
                    .Invoke(theObject, null);

await (dynamic) objType.GetTypeInfo()
                       .GetDeclaredMethod("ThePrivateMethod")
                       .Invoke(theObject, null);

问题是,如果我不知道返回类型,则需要像第二个示例中那样。但是我的问题是我不能在项目中使用动力学。如何在不知道返回类型且不使用动态的情况下调用异步方法。

3 个答案:

答案 0 :(得分:4)

通过反射等待Task<T>将是一个真正的痛苦。相反,您可以拆分问题:您已经知道如何等待Task,之后只需手动获取结果即可。

var task = objType.GetTypeInfo()
    .GetDeclaredMethod("ThePrivateMethod")
    .Invoke(theObject, null);

await (Task)task;

var taskType = task.GetType();

if (taskType.IsGenericType && taskType.GetGenericTypeDefinition() == typeof(Task<>))
{
    var result = taskType.GetProperty("Result").GetValue(task);

    Console.WriteLine(result);
}

看起来框架有时返回伪装为Task<VoidTaskResult>的{​​{1}}。如果有问题,可以将其过滤掉:

Task

答案 1 :(得分:-1)

尽管通用Task派生自Task,但result属性仅存在于Task类定义上。此外,由于它不是接口,因此不能协变,因此不能将X的任务分配给对象的任务。

您将无需使用动态或反射。

最简单而不使用动态外观的

var task = (Task) objType.GetTypeInfo()
                .GetDeclaredMethod("ThePrivateMethod")
                .Invoke(theObject, null);

await task;

object result = task.GetType().GetProperty(“Result”).GetValue(task, null)

答案 2 :(得分:-2)

会将其指定为对象作品吗?

   TheObjectClass theObject = new TheObjectClass();
    Type objType = typeof(TheObjectClass);
    object obj = objType.GetTypeInfo().GetDeclaredMethod("GetInt").Invoke(theObject, null);
    object val  = obj.GetType().GetProperty("Result").GetValue(obj);
    Type t = val.GetType();
    Console.WriteLine(t.Name);