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

时间:2015-09-22 08:42:11

标签: c# casting task

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

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

如果在投射时已知T,则应该没有问题:

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

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

答案 2 :(得分:2)

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

var task = obj as Task<T>;

答案 3 :(得分:1)

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

var task = (Task<X>)obj;

如果您有对象结果,解包,并且您需要实例的任务结果,则可以使用Task.FromResult(X)返回已完成Task<T>类型X

答案 4 :(得分:0)

给出:

  • 该变量定义为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;
    }
}