Utiliser Reflection pour identifier les méthodes d'extension
En C#, les méthodes d'extension constituent un moyen pratique d'ajouter de nouvelles fonctionnalités aux types existants sans modifier l'original. définition de classe. Déterminer si une méthode d'extension a été ajoutée à une classe peut être utile dans divers scénarios, tels que les tests unitaires ou la garantie d'une implémentation correcte.
Pour identifier les méthodes d'extension à l'aide de la réflexion, vous devez d'abord regarder dans les assemblys où l'extension méthode peut être définie. Identifiez les classes décorées avec l’attribut ExtensionAttribute et examinez les méthodes au sein de ces classes. Toute méthode marquée avec ExtensionAttribute et dont le premier type de paramètre correspond au type que vous étudiez est une méthode d'extension.
using System; using System.Runtime.CompilerServices; using System.Reflection; using System.Linq; using System.Collections.Generic; public static class FirstExtensions { public static void Foo(this string x) { } public static void Bar(string x) { } // Not an ext. method public static void Baz(this int x) { } // Not on string } public static class SecondExtensions { public static void Quux(this string x) { } } public class Test { static void Main() { Assembly thisAssembly = typeof(Test).Assembly; foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string))) { Console.WriteLine(method); } } static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType) { var isGenericTypeDefinition = extendedType.IsGenericType && extendedType.IsTypeDefinition; var query = 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; return query; } }
Dans cet exemple, GetExtensionMethods identifie toutes les méthodes d'extension pour le type de chaîne dans l'assembly thisAssembly. Il rassemble les types décorés avec ExtensionAttribute et examine leurs méthodes pour le type de paramètre approprié et ExtensionAttribute.
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!