C#에서 Python의 데코레이터를 구현하기 위한 샘플 프로젝트

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 환경에서 빌드해야만 정상 작동합니다.

4 Likes

아, 하나 더 빼먹었네요. 이 예제는 매개변수가 없고 반환값도 없는 메서드(Action 타입)에서만 작동합니다.

1 Like

Python의 데코레이터란게 어떤건가요?