Réflexion dans le .NET Framework pour les applications Windows Store

À compter de .NET Framework 4.5, .NET Framework fournit un ensemble de types et membres de réflexion à utiliser dans les applications Windows 8.x Store. Ces types et membres sont disponibles dans le .NET Framework complet et dans .NET pour les applications du Windows Store. Ce document explique les principales différences entre ceux-là et leurs équivalents dans .NET Framework 4 et les versions antérieures.

Si vous créez une application Windows 8.x Store, vous devez utiliser les types et les membres de réflexion dans .NET pour les applications Windows 8.x Store. Ces types et membres étant également disponibles, mais pas obligatoires, pour les applications de bureau, il est possible d'utiliser le même code pour les deux types d'applications.

TypeInfo et chargement des assemblys

Dans les applications .NET pour Windows 8.x Store, la classe TypeInfo contient certaines des fonctionnalités de la classe Type .NET Framework 4. Un objet Type représente une référence à la définition d'un type, tandis qu'un objet TypeInfo représente la définition de ce type. Cela vous permet de manipuler des objets Type sans obliger le runtime à charger l'assembly qu'ils référencent. L'obtention de l'objet TypeInfo associé force le chargement de l'assembly.

TypeInfo contient la plupart des membres disponibles sur Type, et de nombreuses propriétés de réflexion des applications .NET pour Windows 8.x Store retournent des collections d’objets TypeInfo. Pour obtenir un objet TypeInfo à partir d'un objet Type, utilisez la méthode GetTypeInfo.

Méthodes de requête

Dans les applications .NET pour Windows 8.x Store, utilisez les propriétés de réflexion qui retournent des collections IEnumerable<T> plutôt que des méthodes qui retournent des tableaux. Les contextes de réflexion peuvent implémenter le parcours différé de ces collections pour de grands assemblys ou types.

Les propriétés de réflexion retournent uniquement les méthodes déclarées sur un objet particulier au lieu de parcourir l'arborescence d'héritage. De plus, elles n'utilisent pas de paramètres BindingFlags pour le filtrage. Le filtrage s'effectue dans le code utilisateur, en utilisant des requêtes LINQ sur les collections retournées. Pour les objets réflexion provenant du runtime (par exemple, les résultats de typeof(Object)), il est plus efficace de parcourir l'arborescence d'héritage en utilisant les méthodes d'assistance de la classe RuntimeReflectionExtensions. Les consommateurs des objets provenant de contextes de réflexion personnalisés ne peuvent pas utiliser ces méthodes, et doivent parcourir l'arborescence d'héritage eux-mêmes.

Restrictions

Dans une application du Windows 8.x Store, l’accès à certains types et membres de .NET Framework est restreint. Par exemple, vous ne pouvez pas appeler les méthodes .NET Framework qui ne sont pas incluses dans les applications Windows 8.x Store à l’aide d’un objet MethodInfo. En outre, certains types et membres qui ne sont pas considérés comme sécurisés dans le contexte d’une application Windows 8.x Store sont bloqués, comme le sont les membres Marshal et WindowsRuntimeMarshal. Cette restriction concerne uniquement les types et membres de .NET Framework. Vous pouvez appeler votre code ou un code tiers de façon habituelle.

Exemple

Cet exemple utilise les types et membres de réflexion dans .NET pour Windows 8.x Store pour récupérer les méthodes et propriétés du type Calendar, y compris les méthodes et propriétés héritées. Pour exécuter ce code, collez-le dans le fichier de code d’une page Windows 8.x Store qui contient un contrôle Windows.UI.Xaml.Controls.TextBlock nommé textblock1 dans un projet nommé Reflection. Si vous collez ce code dans un projet avec un nom différent, veillez à modifier le nom de l'espace de noms pour refléter celui du projet.

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

Voir aussi