Maison > développement back-end > C++ > Comment puis-je intercepter les appels de méthode en C# sans prise en charge explicite de l'AOP ?

Comment puis-je intercepter les appels de méthode en C# sans prise en charge explicite de l'AOP ?

Linda Hamilton
Libérer: 2025-01-15 19:02:43
original
645 Les gens l'ont consulté

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

Interception d'appel de méthode en C#

C# ne prend pas en charge directement AOP, mais des techniques intelligentes permettent l'interception des appels de méthode. Examinons cela avec des exemples de classes :

<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>
Copier après la connexion

Interception sans modification des méthodes

Cette approche exploite Reflection.Emit pour l'injection dynamique de code :

  1. Récupération de métadonnées de méthode : Utilisez GetMethods pour obtenir des méthodes nécessitant une interception.
  2. Proxy dynamique et génération IL : Créez un proxy dynamique héritant du type d'origine et un ILGenerator pour les méthodes interceptées.
  3. Injecter du code d'interception : Utilisez ILGenerator pour insérer des appels à Logger.LogStart avant et Logger.LogEnd après l'exécution de la méthode.
  4. Instanciation et redirection du proxy : Instanciez le proxy dynamique, redirigeant les appels de méthode d'origine vers le proxy.

Interception avec changements mineurs d'appelant

Modifier Caller.Call légèrement permet une approche événementielle :

  1. Interface d'événement d'invocation : Définissez une interface avec des événements déclenchés avant et après les appels de méthode.
  2. Implémentation de l'interface d'invocation : Implémentez cette interface dans une classe distincte.
  3. Abonnement aux événements : Abonnez-vous à ces événements dans Caller.Call, déclenchant des Logger appels avant et après l'exécution de la méthode.

Implications sur les performances

La méthode Reflection.Emit, bien que puissante, introduit une surcharge de performances. Les mises en œuvre de la production doivent donner la priorité aux stratégies d'optimisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal