Dela via


Köra frågor mot en sammansättnings metadata med Reflektion (LINQ)

Du använder API:er för .NET-reflektion för att undersöka metadata i en .NET-sammansättning och skapa samlingar av typer, typmedlemmar och parametrar som finns i den sammansättningen. Eftersom dessa samlingar stöder det allmänna IEnumerable<T> gränssnittet kan de efterfrågas med hjälp av LINQ.

I följande exempel visas hur LINQ kan användas med reflektion för att hämta specifika metadata om metoder som matchar ett angivet sökvillkor. I det här fallet hittar frågan namnen på alla metoder i sammansättningen som returnerar uppräkningsbara typer, till exempel matriser.

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

I exemplet används Assembly.GetTypes metoden för att returnera en matris med typer i den angivna sammansättningen. Var filtret tillämpas så att endast offentliga typer returneras. För varje offentlig typ genereras en underfråga med hjälp av matrisen MethodInfo som returneras från anropet Type.GetMethods . Dessa resultat filtreras för att endast returnera de metoder vars returtyp är en matris eller en annan typ som implementerar IEnumerable<T>. Slutligen grupperas dessa resultat med hjälp av typnamnet som en nyckel.