首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何调用异步方法并在不使用动力学的情况下获得结果

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

Stack Overflow用户
提问于 2018-09-21 15:04:26
回答 3查看 455关注 0票数 0

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

我想用反射调用异步方法。我想有两种方法

代码语言:javascript
运行
复制
await (Task) objType.GetTypeInfo()
                    .GetDeclaredMethod("ThePrivateMethod")
                    .Invoke(theObject, null);

代码语言:javascript
运行
复制
await (dynamic) objType.GetTypeInfo()
                       .GetDeclaredMethod("ThePrivateMethod")
                       .Invoke(theObject, null);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-21 15:15:11

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

代码语言:javascript
运行
复制
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。如果这是个问题,你可以过滤掉:

代码语言:javascript
运行
复制
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);
}
票数 4
EN

Stack Overflow用户

发布于 2018-09-21 16:09:18

虽然泛型任务是从Task派生的,但result属性仅存在于Task类定义中。此外,由于它不是一个接口,所以它不能是协变的,所以不能将X的任务分配给对象的任务。

您将需要使用动态或反射,没有办法绕过它。

如果不使用dynamic,那么最简单的方法可能是

代码语言:javascript
运行
复制
var task = (Task) objType.GetTypeInfo()
                .GetDeclaredMethod("ThePrivateMethod")
                .Invoke(theObject, null);

await task;

object result = task.GetType().GetProperty(“Result”).GetValue(task, null)
票数 -1
EN

Stack Overflow用户

发布于 2018-09-21 15:07:41

将其指定为对象是否有效?

代码语言:javascript
运行
复制
   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);
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52446519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档