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

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

Linda Hamilton
Linda Hamiltonoriginal
2025-01-06 08:57:40321parcourir

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

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

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!

Déclaration:
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