2016-10-11 27 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

您可以使用反射來檢查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

你也錯過了這一點:'如果(執行返回的東西)'.. –

+0

然後任務? –