Zapytanie dotyczące metadanych zestawu z odbiciem (LINQ)
Interfejsy API odbicia platformy .NET służą do badania metadanych w zestawie .NET i tworzenia kolekcji typów, składowych typów i parametrów, które znajdują się w tym zestawie. 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: {0}", groupOfMethods.Key);
foreach (var method in groupOfMethods)
{
Console.WriteLine(" {0}", method);
}
}
W przykładzie użyto Assembly.GetTypes metody , aby zwrócić tablicę typów w określonym zestawie. Filtr, w którym jest stosowany, tak aby zwracane były tylko typy publiczne. Dla każdego typu publicznego podzapytywanie jest generowane przy użyciu MethodInfo tablicy 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.