如何将对象类型转换为 Task<T> 类型?

How to cast object type to Task<T> type?

如何将类型 object 的对象实例转换为类型 Task<T>

我将 Task<T> 引用存储在 object 类型的变量中,需要将其转换回 Task<T> 因为该方法需要 return 类型 Task<T>.

如果 T 在施法时已知,则执行以下操作应该没有问题:

Task<T> myTask = (Task<T>)myObject;

示例:https://dotnetfiddle.net/oOg4E8

如果您存储的对象实际上是 Task<T> 您可以使用直接转换。

var task = (Task<X>)obj;

如果您有未包装的对象结果,并且您需要来自实例的任务结果,您可以使用 Task.FromResult(X) 其中 return 类型 [=14] 的已完成 Task<T> =].

您可以使用 as 运算符。如果对象是 Task<T> 类型,您将获得正确的引用。否则你会得到 null.

var task = obj as Task<T>;

鉴于:

  • 变量定义为object
  • 值为Task<T1>
  • 类型
  • T1 在编译时不可用。
  • 您需要将对象转换为 Task<T2>,其中 T1 : T2,而不是 T1 == T2(可能 T2 是由 T1 实现的接口)。

其他答案在 T1 != T2 时将无效。

这种扩展方法很适合我进行演员表制作。

public static class TaskExtensions
{
    public static Task<T> CastTask<T>(this object taskObj)
    {
        var taskType = taskObj.GetType();
        if (!taskType.IsSubClassOfGeneric(typeof(Task<>)))
            throw new ArgumentException($"{taskType.FullName} is not of type Task<>");
        var resultType = taskType.GenericTypeArguments.First();
        var castTaskMethodGeneric = typeof(TaskExtensions)
            .GetMethod("CastTaskInner", BindingFlags.Static | BindingFlags.Public);
        var castTaskMethod = castTaskMethodGeneric.MakeGenericMethod(
            new Type[] { resultType, typeof(T) });
        var objCastTask = castTaskMethod.Invoke(null, new object[] { taskObj });
        return objCastTask as Task<T>;
    }

    public static async Task<TResult> CastTaskInner<T, TResult>(Task<T> task)
    {
        var t = await task;
        var tObj = (object)t;
        return (TResult)tObj;
    }
}

尝试使用 Task.FromResult<TResult> method。来自 MSDN:

T obj = new T();
Task<T> a = Task.FromResult(obj);