如何将对象类型转换为 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;
如果您存储的对象实际上是 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);
如何将类型 object
的对象实例转换为类型 Task<T>
?
我将 Task<T>
引用存储在 object
类型的变量中,需要将其转换回 Task<T>
因为该方法需要 return 类型 Task<T>
.
如果 T
在施法时已知,则执行以下操作应该没有问题:
Task<T> myTask = (Task<T>)myObject;
如果您存储的对象实际上是 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);