Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh memintas Panggilan Kaedah dalam C# Tanpa Sokongan AOP Eksplisit?

Bagaimanakah saya boleh memintas Panggilan Kaedah dalam C# Tanpa Sokongan AOP Eksplisit?

Linda Hamilton
Lepaskan: 2025-01-15 19:02:43
asal
648 orang telah melayarinya

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

Pemintasan Panggilan Kaedah dalam C#

C# tidak mempunyai sokongan AOP langsung, tetapi teknik pintar membolehkan pemintasan panggilan kaedah. Mari kita periksa ini dengan contoh kelas:

<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>
Salin selepas log masuk

Pemintasan Tanpa Mengubah Kaedah

Pendekatan ini memanfaatkan Reflection.Emit untuk suntikan kod dinamik:

  1. Cara Mendapatkan Metadata: Gunakan GetMethods untuk mendapatkan kaedah yang memerlukan pemintasan.
  2. Proksi Dinamik dan Penjanaan IL: Buat proksi dinamik yang diwarisi daripada jenis asal dan ILGenerator untuk kaedah dipintas.
  3. Kod Memintas Menyuntik: Gunakan ILGenerator untuk memasukkan panggilan ke Logger.LogStart sebelum dan Logger.LogEnd selepas pelaksanaan kaedah.
  4. Pemasangan dan Pengalihan Proksi: Segerakkan proksi dinamik, mengubah hala panggilan kaedah asal kepada proksi.

Pemintasan dengan Perubahan Kecil Pemanggil

Mengubah suai Caller.Call sedikit membenarkan pendekatan berasaskan acara:

  1. Antara Muka Acara Invocation: Tentukan antara muka dengan peristiwa yang dicetuskan sebelum dan selepas panggilan kaedah.
  2. Pelaksanaan Antara Muka Invocation: Laksanakan antara muka ini dalam kelas yang berasingan.
  3. Langganan Acara: Langgan acara ini dalam Caller.Call, mencetuskan Logger panggilan sebelum dan selepas pelaksanaan kaedah.

Implikasi Prestasi

Kaedah Reflection.Emit, walaupun berkuasa, memperkenalkan overhed prestasi. Pelaksanaan pengeluaran harus mengutamakan strategi pengoptimuman.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memintas Panggilan Kaedah dalam C# Tanpa Sokongan AOP Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan