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

Aktualisiert: November 2007

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

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, das die .NET Framework-Version 3.5 zum Ziel hat. Das Projekt weist standardmäßig 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 in Ihr 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 to Objects