Heim >Backend-Entwicklung >C++ >Wie kann Reflection zur Identifizierung von Erweiterungsmethoden in C# verwendet werden?

Wie kann Reflection zur Identifizierung von Erweiterungsmethoden in C# verwendet werden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-06 08:57:40357Durchsuche

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

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 &amp;&amp; extendedType.IsTypeDefinition;
        var query = from type in assembly.GetTypes()
            where type.IsSealed &amp;&amp; !type.IsGenericType &amp;&amp; !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 &amp;&amp; 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn