2017-01-06 3 views
0

Ich versuche Postsharp zu verwenden, ändern Sie die Rückgabewerte von asynchronen Methoden. Ist es möglich, das Ergebnis einer Aufgabe zur Laufzeit zu erhalten, ohne T zu kennen?Zugriff Ergebnis der Aufgabe <T> ohne zu wissen, T - Postsharp

heißt

public void OnSuccess(MethodExecutionArgs args) 
{ 

var returnValue = args.ReturnValue; 

// returnType is Task<T> 
var returnType = returnValue.GetType();  

// Is it possible to access the result of the task? 

// If T was known then I could cast: 
// ((Task<T>) returnValue).ContinueWith(t => t.Result ...) 
} 
+2

Nun, wenn Sie die * Typ * des Ergebnisses nicht wissen, was Sie damit zu tun erwarten? –

+0

einige der Methoden geben Objekte zurück, die ein schmutziges Flag enthalten, ich möchte es setzen –

+1

Kann T nur ein Typ sein, der abgeleitet ist? Wenn Sie den Where-Spezifizierer hinzufügen, können Sie auf die Funktionalität der Basisklasse zugreifen. – Dispersia

Antwort

1

unreflektiert, würden Sie verwenden und Schnittstelle benötigen. Auch mit PostSharp 5.0 erhalten Sie das Ergebnis selbst dort in der OnSuccess Methode anstelle der Task<>.

Dieses Beispiel arbeitet mit Postsharp 5.0:

using System; 
using System.Threading.Tasks; 
using PostSharp.Aspects; 
using PostSharp.Serialization; 

namespace OnMethodBoundaryAsyncTest 
{ 
    interface IDirtiness 
    { 
     bool Dirty { get; set; } 
    } 

    class MyClassWithSomeDirtyObjects : IDirtiness 
    { 
     public bool Dirty { get; set; } 
    } 

    [PSerializable] 
    class ReportDirtinessAttribute : OnMethodBoundaryAspect 
    { 
     public override void OnSuccess(MethodExecutionArgs args) 
     { 
      IDirtiness maybeDirtyObject = args.ReturnValue as IDirtiness; 

      if (maybeDirtyObject != null) 
      { 
       string dirty = maybeDirtyObject.Dirty ? "is" : "is not"; 
       Console.WriteLine($"{maybeDirtyObject} {dirty} dirty."); 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      CreateObject(false).GetAwaiter().GetResult(); 
      CreateObject(true).GetAwaiter().GetResult(); 
     } 

     [ReportDirtiness(ApplyToStateMachine = true)] 
     static async Task<MyClassWithSomeDirtyObjects> CreateObject(bool dirty) 
     { 
      return new MyClassWithSomeDirtyObjects {Dirty = dirty}; 
     } 
    } 
} 
Verwandte Themen