如何从等待非泛型任务中获取任务结果

5
我有以下方法:

我有以下方法:

public async Task Execute()
{
    object previous = null;

    // _delegates is of type IReadOnlyCollection<Delegate>
    foreach (Delegate method in _delegates) 
    {
        Task executing = (Task) (previous != null
           ? method.DynamicInvoke(_repository, previous)
           : method.DynamicInvoke(_repository);

        await executing;

        // pseudo code here
        if (executing returns something)
           previous = executing.Result //<-- ?
        else
           previous = null;
    }
}

基本上我会按顺序遍历委托列表并执行。每个委托都接收一个仓库作为参数,并且返回前一个委托的返回值(如果有的话)。
一些委托将返回Task,另一些则返回Task<TResult>。如果有后者出现,我想将TResult值存储在previous中,以便我可以将其作为下一个委托的参数传递。
有办法实现这个吗?
2个回答

5
您可以使用反射来检查执行对象的类型是否为Task<T>,如果是,则可以像这样读取“Result”属性:
var taskType = executing.GetType();

bool isTaskOfT =
    taskType.IsGenericType
    && taskType.GetGenericTypeDefinition() == typeof(Task<>);

if (isTaskOfT)
{
    object result = taskType.GetProperty("Result").GetValue(executing);
}

我会测试一下并告诉你。谢谢! - Matias Cicero
刚刚我也在尝试类似的东西 :) 很不错。 - Gilad Green
这只是一个警告,该检查无法可靠地确定Task<TResult>,具体取决于运行时,例如它可以是System.Runtime.CompilerServices.AsyncTaskMethodBuilder1+Asyn‌​cStateMachineBox1[TR‌​esult,TStateMachine] - Saeb Amini

-3

如果需要添加类型转换:

if (executing returns something)
    previous = ((Task<object>)executing).Result
else
    previous = null;

那么 Task<object>? - Marcin Dudek
3
如果任务(Task)是协变的,那么这将起作用。 - Matias Cicero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接