Cómo: Consultar los metadatos de un ensamblado con la función de reflexión (LINQ)
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 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();
}
}
}
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 para la versión 3.5 de .NET Framework. De forma predeterminada, el proyecto incluye 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. 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.