在下面的示例代码中(由于if检查无效,所以无法编译),我需要确定returnValue是“TResult的任务”还是任务或其他类型。如果是TResult的任务,我可以访问并记录Result属性,如果是任务,则没有返回值,我记录“[Task]",如果两者都不是,则我可以直接记录返回值或记录[“null”]
public void LogReturnValue(obj returnValue)
{
var valueToLog = "";
if(returnValue is Task)
{
valueToLog = "[Task]";
} else if(returnValue is Task<T>)
{
valueToLog = returnValue.Result;
}
else
{
valueToLog = returnValue ?? "[null]"
}
this.logger.Log(valueToLog);
}
我想确定“returnValue”是一个任务还是“TResult的任务”,如果是后者,则从Result中提取适当的值。我的一个想法是检查IsGenericType属性,但我不确定是否始终有效。
6条答案
按热度按时间iih3973s1#
尽管Eric Lippert提到您不应该获取Task.Result,但仍有一些问题需要回答:
1.如何检查对象是否为泛型类型
1.不管是任务
1.如何访问泛型属性值
jei2mxaa2#
可能有一个更干净的方法,但这是可行的,你可以在它的基础上构建。“as”将检查类型或基类型是一个任务,然后你可以检查类型,看看它是否有泛型类型参数。因为它是动态的,检查结果是一个属性是在运行时完成,而不是编译时。
svdrlsy43#
我觉得要么前面的回答都没有清楚地回答被问到的问题,要么我宁愿错过了问题意图的标记。
我对这个问题的理解是:
此测试代码可用于确定:
结果如下:
h5qlskok4#
让我们保持简单,好吗?这个方法会给予你这样的想法:
它告诉你任务是否有结果,如果有,它返回结果。
备选版本
我已经测试了
VoidTaskResult
,它工作正常。e0uiprwp5#
我注意到,在**.Net 5中,从来不需要null属性访问器
?.
,因为Result**属性对所有任务都存在。它被初始化为System.Threading.Tasks.VoidTaskResult
。这不是获取值的最有效方法,但它很简洁。voase2hg6#
这可能会有帮助。
用途:
参考:How to get the type of T from a member of a generic class or method