Share via


Query's uitvoeren op de metagegevens van een assembly met Weerspiegeling (LINQ)

U gebruikt de .NET-reflectie-API's om de metagegevens in een .NET-assembly te onderzoeken en verzamelingen van typen, typeleden en parameters te maken die zich in die assembly bevinden. Omdat deze verzamelingen de algemene IEnumerable<T> interface ondersteunen, kunnen ze worden opgevraagd met behulp van LINQ.

In het volgende voorbeeld ziet u hoe LINQ kan worden gebruikt met weerspiegeling om specifieke metagegevens op te halen over methoden die overeenkomen met een opgegeven zoekcriterium. In dit geval zoekt de query de namen van alle methoden in de assembly die opsommingsbare typen, zoals matrices, retourneren.

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

In het voorbeeld wordt de Assembly.GetTypes methode gebruikt om een matrix met typen in de opgegeven assembly te retourneren. Het filter waar wordt toegepast, zodat alleen openbare typen worden geretourneerd. Voor elk openbaar type wordt een subquery gegenereerd met behulp van de MethodInfo matrix die wordt geretourneerd door de Type.GetMethods aanroep. Deze resultaten worden gefilterd om alleen de methoden te retourneren waarvan het retourtype een matrix is of een ander type dat wordt geïmplementeerd IEnumerable<T>. Ten slotte worden deze resultaten gegroepeerd met behulp van de typenaam als sleutel.