Procedimiento para consultar los metadatos de un ensamblado con la función de reflexión (LINQ)

Las API de reflexión de .NET se usan para examinar los metadatos de un ensamblado .NET y para crear colecciones de tipos, miembros de tipo y parámetros que se encuentren en ese ensamblado. Dado que estas colecciones admiten la interfaz genérica IEnumerable<T>, se pueden consultar mediante LINQ.

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

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

El ejemplo usa el método Assembly.GetTypes para devolver una matriz de tipos en el ensamblado especificado. Se aplica el filtro where para que solo se devuelvan tipos públicos. Para cada tipo público, se genera una consulta anidada con la matriz MethodInfo que se devuelve desde la llamada Type.GetMethods. Estos resultados se filtran para que solo devuelvan los métodos cuyo tipo de valor devuelto sea una matriz, o un tipo que implemente IEnumerable<T>. Por último, estos resultados se agrupan usando el nombre de tipo como una clave.