Reflexão no .NET Framework para aplicativos da Windows Store

Desde sua versão 4.5, o .NET Framework inclui um conjunto de membros e tipos de reflexão para uso em aplicativos Windows 8.x Store. Esses tipos e membros estão disponíveis no .NET Framework completo, bem como no .NET para aplicativos da Windows Store. Este documento explica as principais diferenças entre eles e seus equivalentes no .NET Framework 4 e em versões anteriores.

Se estiver criando um aplicativo Windows 8.x Store, você deverá usar os tipos de reflexão e os membros no .NET para aplicativos Windows 8.x Store. Esses membros e tipos também estão disponíveis, mas não são obrigatórios, para uso em aplicativos da área de trabalho, portanto você pode usar o mesmo código para os dois tipos de aplicativos.

TypeInfo e Carregamento do Assembly

No .NET para aplicativos Windows 8.x Store, a classe TypeInfo contém algumas das funcionalidades da classe Type do .NET Framework 4. Um objeto Type representa uma referência a uma definição de tipo, enquanto um objeto TypeInfo representa a definição de tipo em si. Isso permite que você manipule objetos Type sem necessariamente exigir que o runtime carregue o assembly que eles referenciam. Obter o objeto TypeInfo associado força o assembly a ser carregado.

TypeInfo contém muitos dos membros disponíveis em Type e muitas das propriedades de reflexão no .NET para aplicativos Windows 8.x Store retornam coleções de objetos TypeInfo. Para obter um objeto TypeInfo de um objeto Type, use o método GetTypeInfo.

Métodos de consulta

No .NET para aplicativos Windows 8.x Store, use as propriedades de reflexão que retornam coleções IEnumerable<T> em vez de métodos que retornam matrizes. Os contextos de reflexão podem implementar passagens lentas dessas coleções para grandes tipos ou assemblies.

As propriedades de reflexão retornam apenas os métodos declarados em um objeto específico em vez de percorrer a árvore de herança. Além disso, elas não usam parâmetros BindingFlags para filtragem. Em vez disso, a filtragem ocorre no código do usuário, usando consultas LINQ nas coleções retornadas. Para objetos de reflexão que se originam com o runtime (por exemplo, como resultado de typeof(Object)), a passagem pela árvore de herança é melhor realizada usando os métodos auxiliares da classe RuntimeReflectionExtensions. Os consumidores de objetos de contextos de reflexão personalizados não podem usar esses métodos e devem percorrer a árvore de herança sozinhos.

Restrições

Em um aplicativo Windows 8.x Store, o acesso a alguns membros e tipos do .NET Framework é restrito. Por exemplo, você não pode chamar os métodos do .NET Framework que não estão incluídos no .NET para aplicativos Windows 8.x Store, usando um objeto MethodInfo. Além disso, determinados tipos e membros que não são considerados seguros dentro do contexto de um aplicativo Windows 8.x Store são bloqueados, como são os membros Marshal e WindowsRuntimeMarshal. Essa restrição afeta apenas os tipos e membros do .NET Framework. Você pode chamar seu código ou o código de terceiros como faria normalmente.

Exemplo

Este exemplo usa os tipos e membros de reflexão no .NET para aplicativos Windows 8.x Store para recuperar os métodos e propriedades do tipo Calendar, incluindo os métodos e propriedades herdados. Para executar esse código, cole-o no arquivo de código para uma página do Windows 8.x Store que contém um controle Windows.UI.Xaml.Controls.TextBlock denominado textblock1 em um projeto chamado Reflexão. Se você colar esse código dentro de um projeto com um nome diferente, certifique-se de alterar o nome do namespace para corresponder ao seu projeto.

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

Confira também