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

Vous utilisez les API de réflexion .NET pour examiner les métadonnées dans un assembly .NET et pour créer des collections de types, de membres de type et de paramètres qui se trouvent dans cet assembly. Comme ces collections prennent en charge l’interface générique IEnumerable<T>, elles peuvent être interrogées à l’aide de LINQ.

L’exemple suivant montre comment utiliser LINQ 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é. Ici, la requête recherche les noms de toutes les méthodes dans l’assembly qui retournent des types énumérables tels que des tableaux.

Assembly assembly = Assembly.Load("System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e");
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);
    }
}

L’exemple utilise la méthode Assembly.GetTypes pour retourner un tableau de types de l’assembly spécifié. Le filtre where est appliqué pour que seuls des types publics soient retournés. Pour chaque type public, une sous-requête est générée en utilisant le tableau MethodInfo qui est retourné à partir de l’appel Type.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>. Pour finir, ces résultats sont regroupés en utilisant le nom de type comme clé.