Sdílet prostřednictvím


Jak vytvořit dotaz na metadata sestavení s reflexí (LINQ)

Rozhraní .NET Reflection API slouží k prozkoumání metadat v sestavení .NET a vytváření kolekcí typů, členů typů a parametrů, které jsou v daném sestavení. Vzhledem k tomu, že tyto kolekce podporují obecné IEnumerable<T> rozhraní, lze je dotazovat pomocí LINQ.

Následující příklad ukazuje, jak lze LINQ použít s reflexí k načtení konkrétních metadat o metodách, které odpovídají zadanému kritériu vyhledávání. V tomto případě dotaz najde názvy všech metod v sestavení, které vracejí výčtové typy, jako jsou pole.

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

Příklad používá metodu Assembly.GetTypes k vrácení pole typů v zadaném sestavení. Použije se filtr where , aby se vrátily pouze veřejné typy. Pro každý veřejný typ se vygeneruje poddotaz pomocí MethodInfo pole, které je vráceno z Type.GetMethods volání. Tyto výsledky jsou filtrovány tak, aby vracely pouze ty metody, jejichž návratový typ je pole nebo jiný typ, který implementuje IEnumerable<T>. Nakonec se tyto výsledky seskupí pomocí názvu typu jako klíče.