如何通过等待非通用任务获得任务结果

时间:2016-10-11 21:13:18

标签: c# .net delegates task

我有以下方法:

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 个答案:

答案 0 :(得分:4)

您可以使用Reflection来检查executing对象的类型是否为Task<T>,然后阅读&#34;结果&#34;财产如果是这样的话:

var taskType = executing.GetType();

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

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

答案 1 :(得分:-2)

如果你需要添加施法:

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