在不知道 T 类型的情况下获取 Task 的结果 [重复]

2023-12-23

我正在开发一个 C# 系统,一个类有一个返回 a 的函数System.Threading.Tasks.Task对象并具有属性System.Type返回类型。

当 ReturnType 为 null 时,我知道该方法返回一个 Task 对象。但遗憾的是,没有办法知道实现该接口的类是否会返回一个Task<ReturnType> or Task<object>我需要得到这个方法的结果。我认为最简单的方法是将Task<T> to Task<object>这样我就可以获取结果并使用 ReturnType 中的 Type 值来处理它。

我怎样才能转换Task<T> to Task<object>不知道 T 的类型?

public interface ITaskFactory
{

    ReadOnlyCollection<ParameterInfo> ParametersInfo { get; }

    Type ReturnType { get; }

    Task CreateTask (params object[] args);

}

我需要得到返回的结果Task我通过电话收到的CreateTask()

See: http://dotnetfiddle.net/Bqwz0I http://dotnetfiddle.net/Bqwz0I


我已经尝试了很多东西,唯一对我有用的就是使用反射。我还添加了检测没有值的任务并引发异常的代码。

using System;
using System.Threading.Tasks;
using System.Reflection;

public class Program
{
    private static async Task<object> Convert(Task task)
    {
        await task;
        var voidTaskType = typeof (Task<>).MakeGenericType(Type.GetType("System.Threading.Tasks.VoidTaskResult"));
        if (voidTaskType.IsAssignableFrom(task.GetType()))
            throw new InvalidOperationException("Task does not have a return value (" + task.GetType().ToString() + ")");
        var property = task.GetType().GetProperty("Result", BindingFlags.Public | BindingFlags.Instance);
        if (property == null)
            throw new InvalidOperationException("Task does not have a return value (" + task.GetType().ToString() + ")");
        return property.GetValue(task);
    }

    public static async Task Main()
    {
        Console.WriteLine("Start");
        Task i = CreateTask();
        Task<object> o = Convert(i);
        Console.WriteLine("value: {0}", await o);
        Console.WriteLine("value2: {0}", await Convert(Task.FromResult<int>(123)));

        //Test for tasks without return values
        try
        {
            Console.WriteLine("value3: {0}", await Convert(Task.CompletedTask));
        }
        catch (Exception ex)
        {
            Console.WriteLine("value3: EX {0}", ex.Message);
        }

        //Test for tasks without return values
        try
        {
            Console.WriteLine("value4: {0}", await Convert(Test4()));
        }
        catch (Exception ex)
        {
            Console.WriteLine("value4: EX {0}", ex.Message);
        }
        Console.WriteLine("Done");
    }


    private static Task CreateTask()
    {
        return Task.FromResult("Some result");
    }

    public static async Task Test4()
    {
        await Task.CompletedTask;
        return;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不知道 T 类型的情况下获取 Task 的结果 [重复] 的相关文章

随机推荐

  • 应用程序不使用 MSAL (react-aad-msal) 从缓存中获取访问令牌

    authProvider getAccessToken 为每个 API 调用调用身份验证端点 而不是从缓存中获取它 我不知道问题是否出在 Msal 中的 AcquireTokenSilent 或 React aad msal 中的 getA
  • 为什么静态块中的代码不执行?

    当我打印constant in main the static块不执行 但是当我打印时stat 它确实执行了 有什么重要意义吗static final在Java中 package com test doubt class Doubt pub
  • 如何编写包含“主体块”的自定义 WorkFlow 4 代码活动?

    这可能吗 我知道这是针对 MS 的 因为他们有 WF 活动包 但我不确定它是如何完成的 如果能够使用带有 Body 块的活动来插入其他活动 按钮等 那就太好了 如果不是太麻烦和 或耗时的话 如果您遵循一些规则 这很容易 以下是具有子项的 N
  • 为什么是 em 而不是 px?

    我听说你应该在样式表中定义尺寸和距离em而不是以像素为单位 所以问题是我为什么要使用em代替px在 CSS 中定义样式时 有一个很好的例子来说明这一点吗 说一个比另一个更好的选择是错误的 或者两者都不会在规范中给出自己的目的 甚至值得注意的
  • 为什么所有 NUL 都从我的脚本中删除?

    它看起来像 bash 还有 dash 从我的脚本中过滤掉任何 ASCII NUL printf test 000a echo test sh 1 printf test 001a echo test sh 2 printf ec 000ho
  • Heroku 混合内容 HTTPS/HTTP 问题

    我将应用程序部署到 Heroku 但在 Chrome 控制台中不断收到此错误 bundle js 11892 Mixed Content The page at https herokuapp com login was loaded ov
  • 跨线程编组 COM 接口的首选方法是什么?

    与 CoMarshalInterThreadInterfaceInStream 和 CoGetInterfaceAndReleaseStream 相比 使用 GIT 跨线程编组 COM 接口有哪些优点 缺点 是否有充分的理由选择一种方法而不
  • 解析 @username 的帖子

    我建立了一个类似 Twitter 的 replies 允许用户通过用户每日帖子相互联系 类似于 stackoverflow 以此作为指导https github com kltcalamay sample app compare origi
  • Spark DataFrame 和重命名多列 (Java)

    有没有更好的方法可以同时为给定 SparkSQL 的所有或多个列添加前缀或重命名DataFrame比多次调用dataFrame withColumnRenamed 一个例子是 如果我想检测更改 使用完整外连接 然后我就剩下两个了DataFr
  • Tensorflow 对象检测 api 验证数据大小

    我正在从对象检测 API 运行教程 并将 Oxford 数据集与 ResNet Faster RCNN 一起使用 当我通过运行 eval py 评估经过训练的模型时 Tensorboard 返回大约 0 95 的平滑精度值 我的问题是它评估
  • 我可以在 Django generic.ListView 中拥有多个列表吗?

    作为 Django 初学者 我正在研究 django 文档提供的教程 网址为https docs djangoproject com en 1 5 intro tutorial04 https docs djangoproject com
  • Android - 从收到的短信中获取日期和时间

    我正在开发一个 Android 应用程序 我需要在其中保存发件人 短信正文 日期和时间收到短信 现在我可以捕获消息正文和发件人 但我无法获取短信的日期和时间 即使我查看了 stackoverflow 中的一些帖子 但它们都没有捕获日期和时间
  • NSView 子类中的鼠标单击事件

    我有一个 NSView 子类 它使用 OpenGL 上下文进行初始化 并具有一堆鼠标事件处理 onMouseDown 等 我有一个使用它的应用程序 它有一个包含视图的主 Cocoa 窗口 并且所有鼠标事件都正常工作 但是 我现在尝试在另一个
  • 自动调整 UICollectionView 高度以适应其内容大小

    我有一个 UICollectionView 一个在集合视图中创建新单元格的按钮 我希望 UICollectionView 根据其内容大小调整其大小 当有一两个单元格时 UICollectionView 很短 如果有很多单元格 UIColle
  • 对话框服务内容中的换行符被忽略

    在剑道对话服务窗口的内容中插入换行符 rogress 中的 Kendo Angular 6 对话框 换行符将被忽略 尝试了 html 元素 br 和 n n 例如它在连续一行中显示字符文本 n n n const dialog Dialog
  • 如何向 CRM 2011 进行身份验证?

    我想建立一个简单的网站 客户可以在其中下订单和查看产品 此数据是我的 Microsoft Dynamics CRM 2011 环境 该数据是特定于客户的 因此我需要有关登录用户的信息 用户凭据存储在 CRM 2011 中 使用这些凭据 用户
  • Jython 的内存限制

    如何为我的 Jython 程序设置 JVM 内存限制 Java 的 Xmx 选项 我明白 Jython2 5引入 J 选项以便将选项发送到 JVM jython J Xmx8000m 但是 我必须与java1 6 0 23 上的 Jytho
  • android OAuth-2.0 google 使用 webview 登录获取用户信息

    我正在创建允许用户使用 facebook 或 google 帐户登录的应用程序 他们按下 登录 按钮 然后系统会要求他们使用 facebook 或 google 登录 当他们选择其中之一时 会弹出网络视图 问题是谷歌身份验证 阅读了一些文章
  • 清理带有标题的 URL 的最佳方法是什么

    清理 URL 的最佳方法是什么 我正在寻找这样的网址 什么是最好的头痛药物 我当前的代码 public string CleanURL string str str str Replace str str Replace str str R
  • 在不知道 T 类型的情况下获取 Task 的结果 [重复]

    这个问题在这里已经有答案了 我正在开发一个 C 系统 一个类有一个返回 a 的函数System Threading Tasks Task对象并具有属性System Type返回类型 当 ReturnType 为 null 时 我知道该方法返