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.