首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板