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