Abfragen der Metadaten einer Assembly mit Reflektion (LINQ)

Die Reflexions-APIs von .NET können verwendet werden, um die Metadaten in einer .NET-Assembly zu untersuchen und Sammlungen von Typen, Typmembern, Parametern usw. zu erstellen, die sich in der Assembly befinden. Da diese Auflistungen die generische IEnumerable<T>-Schnittstelle unterstützen, können sie mithilfe von LINQ abgefragt werden.

Das folgende Beispiel zeigt, wie LINQ mit Reflektion verwendet werden kann, um bestimmte Metadaten über Methoden abzurufen, die einem angegebenen Suchkriterium entsprechen. In diesem Fall findet die Abfrage die Namen aller Methoden in der Assembly, die Enumerationstypen zurückgeben, wie z. B. Arrays.

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

Im Beispiel wird die Assembly.GetTypes-Methode verwendet, um ein Array von Typen in der angegebenen Assembly zurückzugeben. Der where-Filter wird angewendet, sodass nur öffentliche Typen zurückgegeben werden. Für jeden öffentlichen Typ wird mit dem MethodInfo-Array eine Unterabfrage generiert, die vom Type.GetMethods-Aufruf zurückgegeben wird. Diese Ergebnisse werden gefiltert, damit nur die Methoden zurückgegeben werden, deren Rückgabetyp ein Array oder ein Typ ist, der IEnumerable<T> implementiert. Abschließend werden die Ergebnisse mithilfe des Typnamens als Schlüssel gruppiert.