Source Generator와 C# 12에서 도입된 Interceptor를 활용하여 C#에서 Python의 데코레이터를 비슷하게나마 흉내낼 수 있었습니다.
쉽게 말해서 이겁니다.
namespace DecoratorDemonstration;
internal static class Program {
private static void Main() => Test();
[Decorator("DecoratorDemonstration.Program.Decorated")]
public static void Test() => Console.WriteLine("Test");
public static Action Decorated(Action action) {
void wrapped() {
Console.WriteLine("Before");
action();
Console.WriteLine("After");
}
return wrapped;
}
}
출력 결과는
Before
Test
After
다만 소스가 (제가 생각하기에) 많이 더럽습니다. 말 그대로 작동만 하게 만들다시피 해서… 게다가 제약도 많습니다. 아직은 정적 메서드에서만 사용 가능하고 하나의 메서드에 여러 DecoratorAttribute를 사용할 수 없습니다. 제네릭 메서드도 지원되지 않습니다. 제 머리로는 이게 한계인가 봅니다. 고수분들의 PR을 기다리겠습니다.
참고로 9.0.200 SDK에서 Interceptor의 사용법이 변경될 예정이라 합니다. 이 예제는 변경된 Interceptor의 사용법을 따르고 있으므로, 1월 7일 현재는 9.0.200 SDK가 포함된 Visual Studio 17.13 Preview 환경에서 빌드해야만 정상 작동합니다.