我有以下方法:

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中,以便将其作为参数传递给下一个委托。

有没有办法做到这一点?

最佳答案

您可以使用反射来检查executing对象的类型是否为Task<T>,然后如下所示读取“ Result”属性:

var taskType = executing.GetType();

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

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

07-26 04:30