何时等待动态调用的方法?

ygo*_*goe 3 .net c# reflection async-await

我的代码执行此操作是为了在网络请求传入时调用已注册的方法。它是 RPC 系统的一部分。

Delegate method;
object result = method.DynamicInvoke(args);
Run Code Online (Sandbox Code Playgroud)

当该方法返回一个值时,一切都很好。但是,当它返回可等待的内容时,我对尝试将可等待的内容返回给网络调用者不感兴趣。他们不会使用它,而且它可能无论如何也无法转让。相反,我需要等待它然后返回实际结果。

我可以检查该方法的返回类型是否类似于Task. 或者一个Task<T>. 够了吗?宇宙中难道就没有其他值得期待的事情吗?我将如何测试该类型Task?我的意思是我不能只做这样的事情:

method.Method.ReturnType is Task
Run Code Online (Sandbox Code Playgroud)

这不会是真的。而且也没有:

method.Method.ReturnType.IsAwaitable
Run Code Online (Sandbox Code Playgroud)

我承认我不能等待一个async void方法。但其他任何最终可以等待的事情都应该等待。

Pau*_*ado 7

可等待的内容是编译器知道的内容。您需要将其确定为您知道如何处理的类型。

尝试这样的事情:

object result = null;
if (method.Method.ReturnType.IsSubclassOf(typeof(Task)))
{
    if (method.Method.ReturnType.IsConstructedGenericType)
    {
        dynamic tmp = method.DynamicInvoke(args);
        result = tmp.GetAwaiter().GetResult();
    }
    else
    {
        (method.DynamicInvoke(args) as Task).GetAwaiter().GetResult();
    }
}
else
{
    result = method.DynamicInvoke(args);
}
Run Code Online (Sandbox Code Playgroud)