如何调用异步方法并在不使用动力学的情况下获得结果
我想用反射调用异步方法。我想有两种方法
await (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
或
await (dynamic) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
问题是,如果我不知道返回类型,我需要像在第二个例子中那样做。但我的问题是我不能在我的项目中使用动力。如何在不知道返回类型和不使用动力学的情况下调用异步方法。
发布于 2018-09-21 15:15:11
通过反射等待一个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>
的Task
。如果这是个问题,你可以过滤掉:
var voidTaskResult = Type.GetType("System.Threading.Tasks.VoidTaskResult");
if (taskType.IsGenericType
&& taskType.GetGenericTypeDefinition() == typeof(Task<>)
&& taskType.GetGenericArguments()[0] != voidTaskResult)
{
var result = task.GetType().GetProperty("Result").GetValue(task);
Console.WriteLine(result);
}
发布于 2018-09-21 16:09:18
虽然泛型任务是从Task派生的,但result属性仅存在于Task类定义中。此外,由于它不是一个接口,所以它不能是协变的,所以不能将X的任务分配给对象的任务。
您将需要使用动态或反射,没有办法绕过它。
如果不使用dynamic,那么最简单的方法可能是
var task = (Task) objType.GetTypeInfo()
.GetDeclaredMethod("ThePrivateMethod")
.Invoke(theObject, null);
await task;
object result = task.GetType().GetProperty(“Result”).GetValue(task, null)
发布于 2018-09-21 15:07:41
将其指定为对象是否有效?
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);
https://stackoverflow.com/questions/52446519
复制相似问题