Udostępnij za pomocą


Jak wykonywać zapytania dotyczące metadanych zestawu za pomocą refleksji (LINQ)

API refleksji platformy .NET służą do badania metadanych w zgromadzeniu .NET i tworzenia kolekcji typów, członków typów oraz parametrów znajdujących się w tym zgromadzeniu. Ponieważ te kolekcje obsługują interfejs ogólny IEnumerable<T> , mogą być odpytywane przy użyciu LINQ.

W poniższym przykładzie pokazano, jak LINQ można używać z odbiciem w celu pobrania określonych metadanych dotyczących metod pasujących do określonego kryterium wyszukiwania. W tym przypadku zapytanie znajduje nazwy wszystkich metod w zestawie, które zwracają typy wyliczalne, takie jak tablice.

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: {groupOfMethods.Key}");
    foreach (var method in groupOfMethods)
    {
        Console.WriteLine($"  {method}");
    }
}

W przykładzie użyto metody Assembly.GetTypes, aby zwrócić tablicę typów w określonym module. Filtr where jest stosowany, aby zwracane były tylko typy publiczne. Dla każdego typu publicznego podzapytanie jest generowane przy użyciu tablicy MethodInfo zwracanej z wywołania Type.GetMethods. Te wyniki są filtrowane w celu zwrócenia tylko tych metod, których typ zwracany jest tablicą lub inny typ implementujący IEnumerable<T>. Na koniec te wyniki są grupowane przy użyciu nazwy typu jako klucza.