Reflexión en .NET Framework para aplicaciones de la Tienda Windows
A partir de .NET Framework 4.5, .NET Framework incluye un conjunto de tipos y miembros de reflexión para su uso en aplicaciones de la Tienda Windows 8.x. Estos tipos y miembros están disponibles en la versión completa de .NET Framework, así como en las aplicaciones .NET para la Tienda Windows. En este documento se explican las diferencias principales entre estos y sus homólogos en .NET Framework 4 y versiones anteriores.
Si va a crear una aplicación de la Tienda Windows 8.x, debe usar los tipos y miembros de reflexión de las aplicaciones .NET para la Tienda Windows 8.x. Estos tipos y miembros también están disponibles, aunque no son necesarios, para su uso en aplicaciones de escritorio, por lo que puede usar el mismo código para ambos tipos de aplicaciones.
TypeInfo y carga de ensamblados
En las aplicaciones .NET para la Tienda Windows 8.x, la clase TypeInfo contiene algunas funcionalidades de la clase Type de .NET Framework 4. Un objeto Type representa una referencia a una definición de tipo, mientras que un objeto TypeInfo representa la propia definición de tipo. Esto permite manipular los objetos Type sin necesidad de que el runtime cargue el ensamblado al que hacen referencia. Al obtener el objeto TypeInfo asociado se fuerza la carga del ensamblado.
TypeInfo contiene muchos de los miembros disponibles en Type, y muchas de las propiedades de reflexión de las aplicaciones .NET para la Tienda Windows 8.x devuelven colecciones de objetos TypeInfo. Para obtener un objeto TypeInfo a partir de un objeto Type, use el método GetTypeInfo.
Métodos de consulta
En las aplicaciones .NET para la Tienda Windows 8.x, use las propiedades de reflexión que devuelven colecciones de IEnumerable<T> en lugar de los métodos que devuelven matrices. Los contextos de reflexión pueden implementar el recorrido diferido de estas colecciones para los ensamblados o tipos de gran tamaño.
Las propiedades de reflexión solo devuelven los métodos declarados en un objeto determinado en lugar de recorrer el árbol de herencia. Además, no usan los parámetros BindingFlags para el filtrado. En su lugar, el filtrado tiene lugar en el código de usuario, mediante el uso de consultas LINQ en las colecciones devueltas. Para los objetos de reflexión que se originan con el runtime (por ejemplo, como resultado de typeof(Object)
), recorrer el árbol de herencia se logra mejor usando los métodos del asistente de la clase RuntimeReflectionExtensions. Los consumidores de objetos de contextos de reflexión personalizados no pueden usar estos métodos, y deben recorrer el árbol de herencia por su cuenta.
Restricciones
En una aplicación de la Tienda Windows 8.x, el acceso a algunos tipos y miembros de .NET Framework está restringido. Por ejemplo, no puede llamar a los métodos de .NET Framework que no estén incluidos en aplicaciones .NET para la Tienda Windows 8.x mediante un objeto MethodInfo. Además, ciertos tipos y miembros que no se consideran seguros en el contexto de una aplicación de la Tienda Windows 8.x están bloqueados, al igual que los miembros Marshal y WindowsRuntimeMarshal. Esta restricción solo afecta a los tipos y miembros de .NET Framework; puede llamar a su propio código o al de otros fabricantes como lo haría normalmente.
Ejemplo
En este ejemplo se usan los tipos y miembros de reflexión de las aplicaciones .NET para la Tienda Windows 8.x a fin de recuperar los métodos y las propiedades del tipo Calendar, incluidos los métodos y las propiedades heredados. Para ejecutar este código, péguelo en el archivo de código de una página de la Tienda Windows 8.x que contenga un control Windows.UI.Xaml.Controls.TextBlock denominado textblock1
en un proyecto denominado Reflexión. Si pega este código dentro de un proyecto con otro nombre, asegúrese de cambiar el nombre del espacio de nombres para que coincida con su proyecto.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Navigation;
using System.Reflection;
using System.Globalization;
using System.Text;
namespace Reflection
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
TypeInfo t = typeof(Calendar).GetTypeInfo();
IEnumerable<PropertyInfo> pList = t.DeclaredProperties;
IEnumerable<MethodInfo> mList = t.DeclaredMethods;
StringBuilder sb = new StringBuilder();
sb.Append("Properties:");
foreach (PropertyInfo p in pList)
{
sb.Append("\n" + p.DeclaringType.Name + ": " + p.Name);
}
sb.Append("\nMethods:");
foreach (MethodInfo m in mList)
{
sb.Append("\n" + m.DeclaringType.Name + ": " + m.Name);
}
textblock1.Text = sb.ToString();
}
}
}
Imports Windows.UI.Xaml.Navigation
Imports System.Reflection
Imports System.Globalization
Imports System.Text
Public NotInheritable Class MainPage
Inherits Page
Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
Dim t As TypeInfo = GetType(Calendar).GetTypeInfo()
Dim pList As IEnumerable(Of PropertyInfo) = t.DeclaredProperties
Dim mList As IEnumerable(Of MethodInfo) = t.DeclaredMethods
Dim sb As New StringBuilder()
sb.Append("Properties:")
For Each p As PropertyInfo In pList
sb.Append((vbLf + p.DeclaringType.Name & ": ") + p.Name)
Next
sb.Append(vbLf & "Methods:")
For Each m As MethodInfo In mList
sb.Append((vbLf + m.DeclaringType.Name & ": ") + m.Name)
Next
textblock1.Text = sb.ToString()
End Sub
End Class