2016-10-11 8 views
2

Ich habe die folgende Methode erwartet:Wie aus Aufgabe Ergebnis erhalten eine nicht generische Aufgabe

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; 
    } 
} 

Grundsätzlich ich über eine Liste der Delegierten laufen, die ich, um auszuführen. Jeder Delegat erhält ein Repository als Argument und den Rückgabewert des vorherigen Delegaten (falls vorhanden).

Einige Delegaten geben eine Task zurück und einige geben eine Task<TResult> zurück. Wenn ich mit letzterem konfrontiert bin, möchte ich den Wert TResult in previous speichern, damit ich es als Argument an den nächsten Delegaten übergeben kann.

Gibt es einen Weg, dies zu erreichen?

Antwort

3

Sie Reflection verwenden können, wenn der Typ des executing Objekt zu überprüfen Task<T> ist und dann das „Ergebnis“ Eigenschaft lesen so, wenn wie folgt aus:

var taskType = executing.GetType(); 

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

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

Ich werde dies testen und Sie wissen lassen. Vielen Dank! –

+0

War gerade etwas ähnliches ich selbst :) Gute one –

-2

In wenn Sie Casting hinzuzufügen:

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

Ich würde, wenn ich 'TResult' würde wissen ... –

+0

Sie auch diesen Punkt fehlt:' if (Ausführen gibt etwas zurück) '.. –

+0

Dann Aufgabe ? –

Verwandte Themen