> 백엔드 개발 > C++ > 명시적인 AOP 지원 없이 C#에서 메서드 호출을 어떻게 가로챌 수 있나요?

명시적인 AOP 지원 없이 C#에서 메서드 호출을 어떻게 가로챌 수 있나요?

Linda Hamilton
풀어 주다: 2025-01-15 19:02:43
원래의
648명이 탐색했습니다.

How Can I Intercept Method Calls in C# Without Explicit AOP Support?

C#의 메서드 호출 가로채기

C#에는 직접적인 AOP 지원이 부족하지만 영리한 기술을 사용하여 메서드 호출을 가로챌 수 있습니다. 예제 클래스를 통해 이를 살펴보겠습니다.

<code class="language-csharp">public class Caller
{
    public static void Call()
    {
        Traced traced = new Traced();
        traced.Method1("test", 10);
        traced.Method2(new object());
    }
}

public class Traced
{
    public void Method1(string name, int value) { }
    public void Method2(object obj) { }
}

public class Logger
{
    public static void LogStart(MethodInfo method, object[] parameters) { /* Logging logic */ }
    public static void LogEnd(MethodInfo method) { /* Logging logic */ }
}</code>
로그인 후 복사

방법 변경 없이 차단

이 접근 방식은 Reflection.Emit 동적 코드 삽입을 활용합니다.

  1. 메소드 메타데이터 검색: 차단이 필요한 메소드를 얻으려면 GetMethods을 사용하세요.
  2. 동적 프록시 및 IL 생성: 원래 유형에서 상속되는 동적 프록시와 가로채는 메서드에 대한 ILGenerator를 만듭니다.
  3. 차단 코드 삽입: 메소드 실행 전후에 ILGenerator에 대한 호출을 삽입하려면 Logger.LogStart를 사용하세요.Logger.LogEnd
  4. 프록시 인스턴스화 및 리디렉션: 동적 프록시를 인스턴스화하여 원래 메서드 호출을 프록시로 리디렉션합니다.

사소한 발신자 변경으로 차단

을 약간 수정하면 이벤트 기반 접근 방식이 허용됩니다.Caller.Call

  1. 호출 이벤트 인터페이스: 메소드 호출 전후에 트리거되는 이벤트로 인터페이스를 정의합니다.
  2. 호출 인터페이스 구현: 이 인터페이스를 별도의 클래스에서 구현합니다.
  3. 이벤트 구독: 내에서 이러한 이벤트를 구독하여 메소드 실행 전후에 Caller.Call 호출을 트리거합니다.Logger

성능에 미치는 영향

방법은 강력하지만 성능 오버헤드를 발생시킵니다. 프로덕션 구현에서는 최적화 전략을 우선시해야 합니다.Reflection.Emit

위 내용은 명시적인 AOP 지원 없이 C#에서 메서드 호출을 어떻게 가로챌 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿