Share via


Cómo: Consultar los metadatos de un ensamblado con la función de reflexión (LINQ)

Actualización: noviembre 2007

En el ejemplo siguiente se muestra cómo se puede usar LINQ con la reflexión para recuperar metadatos concretos sobre métodos que coinciden con un criterio de búsqueda especificado. En este caso, la consulta buscará los nombres de todos los métodos del ensamblado que devuelven tipos enumerables, como matrices.

Ejemplo

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

    Sub Main()
        Dim file As String = "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll"
        Dim asmbly As Assembly = Assembly.LoadFrom(file)
        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();
        }
    }  
}

En el ejemplo se utiliza el método GetTypes para devolver una matriz de tipos del ensamblado especificado. El filtro where se aplica para que sólo se devuelvan los tipos públicos. Para cada tipo público, se genera una subconsulta mediante la matriz MethodInfo que se devuelve de la llamada a GetMethods. Estos resultados se filtran para devolver sólo los métodos cuyo tipo de valor devuelto sea una matriz o, si no, un tipo que implemente IEnumerable<T>. Finalmente, los resultados se agrupan utilizando el nombre de tipo como clave.

Compilar el código

  • Cree un proyecto de Visual Studio orientado a .NET Framework versión 3.5. El proyecto contiene una referencia a System.Core.dll y una directiva using (C#) o una instrucción Imports (Visual Basic) para el espacio de nombres System.Linq de manera predeterminada. En los proyectos de C#, agregue una directiva using para el espacio de nombres System.IO.

  • Copie este código en el proyecto.

  • Presione F5 para compilar y ejecutar el programa.

  • Presione cualquier tecla para salir de la ventana de consola.

Vea también

Conceptos

LINQ to Objects