Maison >développement back-end >C++ >Comment puis-je identifier les méthodes d'extension à l'aide de Reflection en C# ?

Comment puis-je identifier les méthodes d'extension à l'aide de Reflection en C# ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-06 08:52:39664parcourir

How Can I Identify Extension Methods Using Reflection in C#?

Comment identifier les méthodes d'extension à l'aide de la réflexion

En C#, la réflexion fournit un mécanisme puissant pour introspecter les éléments de code. Cela inclut la possibilité d'identifier si une méthode a été étendue à une classe à l'aide de méthodes d'extension.

Déterminer si une méthode existe en tant que méthode d'extension

Pour déterminer si une méthode est une méthode d'extension, nous pouvons utiliser la réflexion pour inspecter les métadonnées de l'assembly. Plus précisément, nous pouvons rechercher :

  1. Classes décorées avec l'attribut ExtensionAttribute. Cet attribut indique que la classe contient des méthodes d'extension.
  2. Méthodes au sein de ces classes décorées avec le ExtensionAttribute attribut.
  3. Le premier paramètre de la méthode correspond au type qui nous intéresse.

Exemple de code

L'extrait de code suivant montre comment vérifier les méthodes d'extension à l'aide de la réflexion :

using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Linq;
using System.Collections.Generic;

public static class Helper
{
    public static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType)
    {
        var isGenericTypeDefinition = extendedType.IsGenericType && 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;
    }
}

Ce code peut être utilisé pour vérifier si une méthode est une méthode d'extension pour un type spécifique dans un assembly donné.

Conclusion

En utilisant la réflexion, nous pouvons déterminer si une méthode a été étendu à une classe en tant que méthode d'extension. Cette technique est utile à diverses fins, comme vérifier que les méthodes d'extension ont été correctement implémentées.

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