MethodBoundaryAspect.Fody - Altering asynchronous method behavior

MethodBoundaryAspect.Fody 要修改非同步方法的回傳值,可在 OnExit 方法實作時將 MethodExecutionArgs.ReturnValue 屬性值轉回 Task,用 ContinueWith 串接處理,並將之塞回 MethodExecutionArgs.ReturnValue。

1
2
3
4
if (args.ReturnValue is Task<...> t)
{
args.ReturnValue = t.ContinueWith(...);
}


像是如果要撰寫一個可將方法回傳值變大寫的 Attribute 的話,可像下面這樣撰寫。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System.Threading.Tasks;
using MethodBoundaryAspect.Fody.Attributes;


namespace MethodBoundaryAspect.Fody.Demo
{
public sealed class UpperAttribute : OnMethodBoundaryAspect
{
public override void OnExit(MethodExecutionArgs args)
{
if (args.ReturnValue is Task<string> t)
{
args.ReturnValue = t.ContinueWith(task => t.Result.ToUpper());
}
else
{
args.ReturnValue = (args.ReturnValue as string).ToUpper();
}
}
}
}


在要做大寫轉換的方法上加掛 Attribute。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Threading.Tasks;


namespace MethodBoundaryAspect.Fody.Demo
{
class Program
{
[Log]
static void Main(string[] args)
{
Console.WriteLine(GetDataAsync().Result);
}


[Upper]
static Task<string> GetDataAsync()
{
return Task.FromResult("hello world!");
}

[Upper]
static string GetData()
{
return "hello world!";
}
}
}


程式在編譯時即會加掛對應的處理,方法運行後可看到回傳值會被轉為大寫。