Partager via


Comment : interroger les métadonnées d'un assembly avec réflexion (LINQ)

Mise à jour : novembre 2007

L'exemple suivant montre comment LINQ peut être utilisé avec la réflexion pour récupérer des métadonnées spécifiques concernant des méthodes qui correspondent à un critère de recherche spécifié. Dans ce cas, la requête recherche les noms de toutes les méthodes dans l'assembly qui retournent des types dénombrables tels que les tableaux.

Exemple

Imports System.Reflection
Imports System.IO
Imports System.Linq
Module Module1

    Sub Main()
        Dim file As String = "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll"
        Dim asmbly As Assembly = Assembly.LoadFrom(file)
        Dim pubTypesQuery = From type In asmbly.GetTypes() _
                            Where type.IsPublic _
                            From method In type.GetMethods() _
                            Where method.ReturnType.IsArray = True _
                            Let name = method.ToString() _
                            Let typeName = type.ToString() _
                            Group name By typeName Into methodNames = Group


        Console.WriteLine("Getting ready to iterate")
        For Each item In pubTypesQuery
            Console.WriteLine(item.methodNames)

            For Each type In item.methodNames
                Console.WriteLine(" " & type)
            Next
        Next
        Console.ReadKey()
    End Sub

End Module
using System.Reflection;
using System.IO;
namespace LINQReflection
{
    class ReflectionHowTO
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089");
            var pubTypesQuery = from type in assembly.GetTypes()
                        where type.IsPublic
                            from method in type.GetMethods()
                            where method.ReturnType.IsArray == true 
                                || ( method.ReturnType.GetInterface(
                                    typeof(System.Collections.Generic.IEnumerable<>).FullName ) != null
                                && method.ReturnType.FullName != "System.String" )
                            group method.ToString() by type.ToString();

            foreach (var groupOfMethods in pubTypesQuery)
            {
                Console.WriteLine("Type: {0}", groupOfMethods.Key);
                foreach (var method in groupOfMethods)
                {
                    Console.WriteLine("  {0}", method);
                }
            }

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }  
}

Cet exemple utilise la méthode GetTypes pour retourner un tableau de types dans l'assembly spécifié. Le filtre where est appliqué afin que seuls les types publics soient retournés. Pour chaque type public, une sous-requête est générée à l'aide du tableau MethodInfo retourné par l'appel de GetMethods. Ces résultats sont filtrés pour retourner uniquement les méthodes dont le type de retour est un tableau ou un type qui implémente IEnumerable<T>. Enfin, ces résultats sont regroupés en utilisant le nom de type comme clé.

Compilation du code

  • Créez un projet Visual Studio qui cible la version 3.5 du .NET Framework. Par défaut, le projet possède une référence à System.Core.dll et une directive using (C#) ou une instruction Imports (Visual Basic) pour l'espace de noms System.Linq. Dans les projets C#, ajoutez une directive using pour l'espace de noms System.IO.

  • Copiez ce code dans votre projet.

  • Appuyez sur F5 pour compiler et exécuter le programme.

  • Appuyez sur une touche pour quitter la fenêtre de console.

Voir aussi

Concepts

LINQ to Objects