Практическое руководство. Выполнение запроса к метаданным сборки при помощи отражения (LINQ)

Api отражения .NET используются для проверки метаданных в сборке .NET и создания коллекций типов, элементов типа и параметров, которые находятся в этой сборке. Поскольку эти коллекции поддерживают универсальный интерфейс IEnumerable<T>, их можно запрашивать с помощью LINQ.

В следующем примере показано использование LINQ с отражением для извлечения определенных метаданных о методах, соответствующих условиям поиска. В этом случае запрос находит имена всех методов в сборке, возвращающих перечислимые типы, такие как массивы.

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

В примере используется метод Assembly.GetTypes для возвращения массива типов в указанной сборке. Чтобы вернуть только открытые типы, применяется фильтр where. Для каждого открытого типа создается вложенный запрос с использованием массива MethodInfo, который возвращается из вызова Type.GetMethods. Эти результаты фильтруются для возвращения только тех методов, возвращаемый тип которых является массивом или типом, который реализует IEnumerable<T>. Наконец, эти результаты группируются с помощью имени типа в качестве ключа.