代码之家  ›  专栏  ›  技术社区  ›  ygoe

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

  •  0
  • ygoe  · 技术社区  · 6 年前

    我的代码这样做是为了在网络请求传入时调用已注册的方法。它是rpc系统的一部分。

    Delegate method;
    object result = method.DynamicInvoke(args);
    

    当方法返回一个值时,一切都很好。但当它返回可等待的东西时,我不想尝试将可等待的东西返回给网络呼叫者。他们不会利用它,而且它也可能是不可转让的。相反,我需要等待它,然后返回实际结果。

    我可以检查方法的返回类型是否类似于 Task 是的。或者 Task<T> 是的。够了吗?宇宙中难道就没有其他可期待的东西吗?我该如何测试类型 任务 是吗?我的意思是我不能这样做:

    method.Method.ReturnType is Task
    

    不会是真的。也没有:

    method.Method.ReturnType.IsAwaitable
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Paulo Morgado    6 年前

    可等待的是编译器知道的事情。你需要把它归结为你知道如何处理的类型。

    试试这样的:

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