反射がなければ、あなたが使用してインタフェースする必要があると思います。また、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};
}
}
}
さてあなたは、結果の*タイプ*がわからない場合、あなたがそれを行うには期待していますか? –
いくつかのメソッドは、ダーティー・フラグを含むオブジェクトを返します。私はそれを設定したい –
派生した型はどれですか? 'where'指定子を追加すると、基本クラスの機能にアクセスできます。 – Dispersia