2017-01-06 11 views
0

postsharpを使用しようとしていますが、非同期メソッドの戻り値を変更しようとしています。 Tを知らずに実行時にタスクの結果を得ることは可能ですか?タスク<T>の結果に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

さてあなたは、結果の*タイプ*がわからない場合、あなたがそれを行うには期待していますか? –

+0

いくつかのメソッドは、ダーティー・フラグを含むオブジェクトを返します。私はそれを設定したい –

+1

派生した型はどれですか? 'where'指定子を追加すると、基本クラスの機能にアクセスできます。 – Dispersia

答えて

1

反射がなければ、あなたが使用してインタフェースする必要があると思います。また、PostSharp 5.0では、Task<>の代わりにOnSuccessメソッドに結果自体があります。

この例は、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}; 
     } 
    } 
}