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

C# 如何调用异步方法并在不使用动力学的情况下返回结果,c#,reflection,async-await,C#,Reflection,Async Await,如何调用异步方法并在不使用动力学的情况下返回结果 我想用反射调用一个异步方法。我发现有两种方法可以做到这一点 await (Task) objType.GetTypeInfo() .GetDeclaredMethod("ThePrivateMethod") .Invoke(theObject, null); 或 问题是,如果我不知道返回类型,我需要像第二个示例中那样执行它。但我的问题是我不能在我的项目中使用动力学。

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

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

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


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

将其指定为对象是否有效

   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);
通过反思等待
任务
将是一种真正的痛苦。相反,您可以拆分问题:您已经知道如何等待
任务
,只需在之后手动检索结果:

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);
}

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

您将需要使用动态或反射,无法绕过它

不使用dynamic的最简单的

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

await task;

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

您始终可以将其强制转换为对象。可能是对象?或者你能不能再多贴一点背景?此等待代码将位于何处?“如果我不知道返回类型”调用此代码的异步方法看起来如何?签名返回类型?或者应该是HelpWait(对象)?您正在使用返回值吗?如果没有像在
异步任务ThePrivateMethod()中那样的返回值,这将引发异常。您是否尝试过不等待它,因此它返回任务,然后等待对象aa=objType.GetTypeInfo()。。。那么你就可以检查这项任务了。。只是一个idea@Ian这不起作用,因为
任务
不是协变量。这里有一个解决这个问题的方法。@Ian当然可以,但现在你不是在等待,而是在阻止结果。
Task
是否存在一些变化,其中
IsGenericType
为false?@MongZhu是的。
任务
源自
任务
<代码>任务
是非泛型的,并且没有
结果
属性。Thx对于这一点,非常聪明!有趣的是,为什么这样的签名
公共异步任务privateMethod()
会导致
任务。GetType()。IsGenericType==true
但是
类型(任务)。IsGenericType==false
?=!。。。confused@MongZhu这是一个令人惊讶的实现细节,但是
异步任务
方法实际上返回的是
任务
,而不是
任务
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);
}
var task = (Task) objType.GetTypeInfo()
                .GetDeclaredMethod("ThePrivateMethod")
                .Invoke(theObject, null);

await task;

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