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
を利用します。
GetMethods
を使用して、インターセプトが必要なメソッドを取得します。ILGenerator
を作成します。ILGenerator
を使用して、メソッドの実行前と実行後に Logger.LogStart
への呼び出しを挿入します。Logger.LogEnd
発信者のマイナー変更によるインターセプト
をわずかに変更すると、イベントベースのアプローチが可能になります。Caller.Call
Caller.Call
呼び出しをトリガーします。Logger
パフォーマンスへの影響
メソッドは強力ですが、パフォーマンスのオーバーヘッドが発生します。 運用環境の実装では、最適化戦略を優先する必要があります。Reflection.Emit
以上が明示的な AOP サポートを使用せずに C# でメソッド呼び出しをインターセプトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。