Compartilhar via


Como consultar metadados de um assembly com reflexão (LINQ)

Você usa as APIs de reflexão do .NET para examinar os metadados no assembly do .NET e criar coleções de tipos, membros de tipo e parâmetros que estão nesse assembly. Como essas coleções dão suporte à interface IEnumerable<T> genéricas, elas podem ser consultadas usando LINQ.

O exemplo a seguir mostra como o LINQ pode ser usado com a reflexão para recuperar metadados específicos sobre os métodos que correspondem a um critério de pesquisa especificado. Nesse caso, a consulta localiza os nomes de todos os métodos no assembly que retornam tipos enumeráveis como matrizes.

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

O exemplo usa o método Assembly.GetTypes para retornar uma matriz de tipos no assembly especificado. O filtro where é aplicado para que apenas tipos públicos sejam retornados. Para cada tipo de público, uma subconsulta é gerada usando a matriz MethodInfo que é retornada da chamada Type.GetMethods. Esses resultados são filtrados para retornar apenas os métodos cujo tipo de retorno é uma matriz ou um tipo que implementa IEnumerable<T>. Por fim, esses resultados são agrupados usando o nome do tipo como uma chave.