如何将object
类型的对象实例强制转换为Task<T>
?
我将Task<T>
引用存储在object
类型的变量中,需要将其强制转换回Task<T>
,因为该方法需要返回类型Task<T>
。
答案 0 :(得分:4)
尝试使用 Task.FromResult<TResult> method
。来自 MSDN:
T obj = new T();
Task<T> a = Task.FromResult(obj);
答案 1 :(得分:2)
答案 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;
}
}