2016-10-11 3 views
2

У меня есть следующий метод:Как получить результат выполнения задачи из ожидания нон родовой задачи

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, поэтому я могу передать его в качестве аргумента для следующего делегата.

Есть ли способ достичь этого?

ответ

3

Вы можете использовать Reflection, чтобы проверить, если тип executing объекта Task<T>, а затем, если прочитать свойство «Результат», так как это:

var taskType = executing.GetType(); 

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

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

Я собираюсь проверить это и сообщить вам. Благодаря! –

+0

Просто попробовал что-то подобное себе :) Хороший –

-2

В, если вам нужно добавить литье:

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

Если бы я знал 'TResult' ... –

+0

, вам также не хватало бы эту точку:' if (выполнение чего-то возвращает) '.. –

+0

Then Task ? –