Heim >Backend-Entwicklung >C++ >Wie kann Reflection zur Identifizierung von Erweiterungsmethoden in C# verwendet werden?
Verwenden von Reflection zur Identifizierung von Erweiterungsmethoden
In C# bieten Erweiterungsmethoden eine praktische Möglichkeit, neue Funktionen zu vorhandenen Typen hinzuzufügen, ohne das Original zu ändern Klassendefinition. Die Feststellung, ob einer Klasse eine Erweiterungsmethode hinzugefügt wurde, kann in verschiedenen Szenarien hilfreich sein, z. B. beim Unit-Testen oder beim Sicherstellen einer ordnungsgemäßen Implementierung.
Um Erweiterungsmethoden mithilfe von Reflektion zu identifizieren, müssen Sie zunächst in den Assemblys suchen, in denen sich die Erweiterung befindet Methode kann definiert werden. Identifizieren Sie Klassen, die mit dem ExtensionAttribute-Attribut versehen sind, und untersuchen Sie die Methoden innerhalb dieser Klassen. Jede Methode, die mit ExtensionAttribute gekennzeichnet ist und deren erster Parametertyp mit dem Typ übereinstimmt, den Sie untersuchen, ist eine Erweiterungsmethode.
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; } }
In diesem Beispiel identifiziert GetExtensionMethods alle Erweiterungsmethoden für den Zeichenfolgentyp in der thisAssembly-Assembly. Es sammelt mit ExtensionAttribute dekorierte Typen und untersucht ihre Methoden auf den entsprechenden Parametertyp und ExtensionAttribute.
Das obige ist der detaillierte Inhalt vonWie kann Reflection zur Identifizierung von Erweiterungsmethoden in C# verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!