Gewusst wie: Abfragen der Metadaten einer Assembly mit Reflektion (LINQ)

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

Beispiel

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

    Sub Main()
        Dim asmbly As Assembly = 
            Assembly.Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089")

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

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

Kompilieren des Codes

  • Erstellen Sie ein Visual Studio-Projekt für .NET Framework, Version 3.5. Standardmäßig weist das Projekt einen Verweis auf System.Core.dll und eine using-Direktive (C#) oder eine Imports-Anweisung (Visual Basic) für den System.Linq-Namespace auf. Fügen Sie in C#-Projekten eine using-Direktive für den System.IO-Namespace hinzu.

  • Kopieren Sie diesen Code ins Projekt.

  • Drücken Sie F5, um das Programm zu kompilieren und auszuführen.

  • Drücken Sie eine beliebige Taste, um das Konsolenfenster zu schließen.

Siehe auch

Konzepte

LINQ-zu-Objekte