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

A partir do .NET Framework 4.5, o .NET Framework inclui um conjunto de tipos de reflexão e membros para uso em aplicativos da Windows Store 8.x. 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 estes e seus homólogos no .NET Framework 4 e versões anteriores.

Se estiver a criar uma aplicação da Loja Windows 8.x, tem de utilizar os tipos de reflexão e os membros no .NET para aplicações da Loja Windows 8.x. Esses tipos e membros também estão disponíveis, mas não são necessários, para uso em aplicativos da área de trabalho, para que você possa usar o mesmo código para ambos os tipos de aplicativos.

TypeInfo e carregamento de montagem

No .NET para aplicativos da Windows Store 8.x, a TypeInfo classe contém algumas das funcionalidades da classe .NET Framework 4 Type . Um Type objeto representa uma referência a uma definição de tipo, enquanto um TypeInfo objeto representa a própria definição de tipo. Isso permite que você manipule Type objetos sem necessariamente exigir que o tempo de execução carregue o assembly ao qual eles se referem. Obter o objeto associado TypeInfo força o assembly a carregar.

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

Métodos de consulta

No .NET para aplicativos da Windows Store 8.x, você usa as propriedades de reflexão que retornam IEnumerable<T> coleções em vez de métodos que retornam matrizes. Contextos de reflexão podem implementar a travessia preguiçosa dessas coleções para grandes montagens ou tipos.

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, eles não usam BindingFlags parâmetros 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 tempo de execução (por exemplo, como o resultado de ), percorrer a árvore de typeof(Object)herança é melhor realizado usando os RuntimeReflectionExtensions métodos auxiliares da classe. Os consumidores de objetos de contextos de reflexão personalizados não podem usar esses métodos e devem atravessar a própria árvore de herança.

Restrições

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

Exemplo

Este exemplo usa os tipos e membros de reflexão no .NET para aplicativos da Windows Store 8.x para recuperar os métodos e propriedades do Calendar tipo, incluindo métodos e propriedades herdados. Para executar esse código, cole-o no arquivo de código de uma página da Windows Store 8.x que contém um Windows.UI.Xaml.Controls.TextBlock controle nomeado textblock1 em um projeto chamado Reflection. Se você colar esse código dentro de um projeto com um nome diferente, apenas 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

Consulte também