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; } }
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!