如何在不使用动力学的情况下调用异步方法并返回结果
我想用反射调用异步方法。我发现有两种方法可以做到这一点
await (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
或
await (dynamic) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
问题是,如果我不知道返回类型,则需要像第二个示例中那样。但是我的问题是我不能在项目中使用动力学。如何在不知道返回类型且不使用动态的情况下调用异步方法。
答案 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);