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

Vea también