Como: Consultar metadados de um Assembly com reflexão (LINQ)

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

Exemplo

Imports System.Reflection
Imports System.IO
Imports System.Linq
Module Module1

    Sub Main()
        Dim asmbly As Assembly = 
            Assembly.Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089")

        Dim pubTypesQuery = From type In asmbly.GetTypes() 
                            Where type.IsPublic 
                            From method In type.GetMethods() 
                            Where method.ReturnType.IsArray = True 
                            Let name = method.ToString() 
                            Let typeName = type.ToString() 
                            Group name By typeName Into methodNames = Group


        Console.WriteLine("Getting ready to iterate")
        For Each item In pubTypesQuery
            Console.WriteLine(item.methodNames)

            For Each type In item.methodNames
                Console.WriteLine(" " & type)
            Next
        Next
        Console.ReadKey()
    End Sub

End Module
using System.Reflection;
using System.IO;
namespace LINQReflection
{
    class ReflectionHowTO
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken= b77a5c561934e089");
            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);
                }
            }

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }  
}

O exemplo usa o GetTypes método para retornar uma matriz de tipos no assembly especificado. O onde filtro é aplicado de forma que somente os tipos públicos são retornados. Para cada tipo de público, uma subconsulta é gerada utilizando a MethodInfo matriz que é retornado de GetMethods chamada. Esses resultados são filtrados para retornar apenas aqueles cujo tipo de retorno é uma matriz, senão um tipo que implementa os métodos IEnumerable<T>. Finalmente, esses resultados são agrupados usando-se o nome de tipo como uma chave.

Compilando o código

  • Criar um projetoVisual Studio que se destina a.NET Framework versão 3.5. O projeto tem uma referência a System.Core.dll e um using diretiva (C#) ou Imports (Visual Basic) da declaração do namespace System. LINQ por padrão. No C# projetos, adicione um using a diretiva para o namespace System. IO.

  • Copie este código em seu projeto.

  • Pressione F5 para compilar e executar o programa.

  • Pressione qualquer tecla para sair da janela do console.

Consulte também

Conceitos

LINQ para Objetos