ホームページ > バックエンド開発 > 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート