Maison > développement back-end > C++ > Comment la réflexion peut-elle être utilisée pour identifier les méthodes d'extension C# ?

Comment la réflexion peut-elle être utilisée pour identifier les méthodes d'extension C# ?

Susan Sarandon
Libérer: 2025-01-06 09:01:42
original
542 Les gens l'ont consulté

How Can Reflection Be Used to Identify C# Extension Methods?

Identifier les méthodes d'extension avec réflexion

Dans le domaine de la programmation C#, la question se pose : comment pouvons-nous utiliser la réflexion pour discerner si une méthode a été incorporé dans une classe en tant que méthode d'extension ? Cette enquête découle du besoin de vérifier qu'une méthode d'extension spécifique a été correctement ajoutée à une classe lors des tests unitaires. Une telle approche est particulièrement pertinente dans les situations où une méthode identique peut être ajoutée à la classe elle-même, conduisant potentiellement le compilateur à sélectionner cette dernière version.

Le parcours technique

Pour accomplir cette tâche, nous devons approfondir tous les assemblages du projet, où peut résider la méthode d'extension recherchée. Notre objectif est de localiser les classes ornées de l'attribut [ExtensionAttribute] et d'examiner ensuite toutes les méthodes au sein de ces classes qui portent également la même décoration. La dernière étape consiste à examiner le type du premier paramètre de chaque méthode pour vérifier s'il correspond au type qui nous intéresse.

Un aperçu du code

Pour fournir une illustration plus pratique, considérons l'extrait de code ci-joint, qui simule la présence de différents types de méthodes, y compris à la fois l'extension et la non-extension. méthodes :

using System;
using System.Runtime.CompilerServices;

public static class FirstExtensions
{
    public static void Foo(this string x) { }
    public static void Bar(string x) { } // Not an extension method
    public static void Baz(this int x) { } // Not on string
}

public static class SecondExtensions
{
    public static void Quux(this string x) { }
}

class Program
{
    static void Main()
    {
        // Get the assembly containing the current type
        Assembly thisAssembly = typeof(Program).Assembly;

        // Enumerate all extension methods for the string type in the assembly
        foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string)))
        {
            Console.WriteLine(method.Name);
        }
    }

    static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType)
    {
        // Determine if the extended type is a generic type definition
        var isGenericTypeDefinition = extendedType.IsGenericType && extendedType.IsTypeDefinition;

        // Query for extension methods in the assembly
        return from type in assembly.GetTypes()
               where type.IsSealed && !type.IsGenericType && !type.IsNested
               from method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
               where method.IsDefined(typeof(ExtensionAttribute), false)
               where isGenericTypeDefinition
                   ? method.GetParameters()[0].ParameterType.IsGenericType && method.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == extendedType
                   : method.GetParameters()[0].ParameterType == extendedType
               select method;
    }
}
Copier après la connexion

Une fois exécuté, ce code récupère et affiche uniquement les méthodes d'extension définies pour le type de chaîne dans l'assembly contenant la classe Program. Les méthodes affichées seraient "Foo" et "Quux", car elles remplissent toutes deux les critères des méthodes d'extension.

En conclusion, la réflexion fournit un mécanisme précieux pour introspecter et identifier les méthodes d'extension au sein d'un assembly. Cette technique peut être particulièrement utile pour tester des scénarios, garantissant ainsi que les méthodes d'extension prévues ont été mises en œuvre avec succès.

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