Reflexe v rozhraní .NET Framework pro aplikace pro Windows Store

Počínaje rozhraním .NET Framework 4.5 obsahuje rozhraní .NET Framework sadu typů reflexí a členů pro použití v aplikacích pro Windows 8.x Store. Tyto typy a členy jsou k dispozici v plném rozhraní .NET Framework a také v .NET pro aplikace pro Windows Store. Tento dokument vysvětluje hlavní rozdíly mezi těmito a jejich protějšky v rozhraní .NET Framework 4 a starších verzích.

Pokud vytváříte aplikaci pro Windows 8.x Store, musíte použít reflexní typy a členy v prostředí .NET pro aplikace Windows 8.x Store. Tyto typy a členy jsou také k dispozici, ale nevyžadují se pro použití v desktopových aplikacích, takže pro oba typy aplikací můžete použít stejný kód.

TypeInfo a načítání sestavení

Třída TypeInfo v .NET pro aplikace Windows 8.x Store obsahuje některé funkce třídy .NET Framework 4 Type. Objekt Type představuje odkaz na definici typu, zatímco TypeInfo objekt představuje samotnou definici typu. To vám umožní manipulovat s Type objekty, aniž by bylo nutné, aby modul runtime načetl sestavení, na které odkazují. Načtení spojeného TypeInfo objektu vyžaduje načtení sestavení.

TypeInfo obsahuje mnoho členů dostupných na Typeplatformě a mnoho vlastností reflexe v aplikacích pro Windows 8.x Store vrací kolekce TypeInfo objektů. K získání objektu TypeInfo z objektu Type použijte metodu GetTypeInfo .

Metody dotazu

V aplikacích .NET pro Windows 8.x Store použijete vlastnosti reflexe, které vrací IEnumerable<T> kolekce místo metod vracejících pole. Kontexty reflexe mohou implementovat líné procházení těchto kolekcí pro rozsáhlé sestavy nebo typy.

Vlastnosti reflexe vrací pouze deklarované metody u konkrétního objektu místo procházení stromu dědičnosti. Navíc nepoužívají BindingFlags parametry pro filtrování. Místo toho se filtrování provádí v uživatelském kódu pomocí dotazů LINQ na vrácených kolekcích. Pro objekty reflexe, které pocházejí z modulu runtime (například jako výsledek typeof(Object)), je nejlepší procházet strom dědičnosti pomocí metod třídy RuntimeReflectionExtensions. Uživatelé objektů z přizpůsobených kontextů reflexe nemohou tyto metody používat a musí sami procházet strom dědičnosti.

Omezení

V aplikaci pro Windows 8.x Store je přístup k některým typům a členům rozhraní .NET Framework omezený. Například nelze volat metody rozhraní .NET Framework, které nejsou zahrnuty v .NET pro aplikace pro Windows 8.x Store pomocí objektu MethodInfo . Kromě toho jsou určité typy a členové, které nejsou považovány za bezpečné v kontextu aplikace pro Windows 8.x Store, blokovány, stejně jako členové Marshal a WindowsRuntimeMarshal. Toto omezení má vliv pouze na typy a členy rozhraní .NET Framework; můžete volat svůj kód nebo kód třetí strany tak, jak to obvykle děláte.

Příklad

Tento příklad využívá typy a členy reflexe v aplikacích .NET pro Windows 8.x Store k získání metod a vlastností typu Calendar, včetně zděděných metod a vlastností. Pokud chcete tento kód spustit, vložte ho do souboru kódu pro stránku Windows 8.x Store, která obsahuje Windows.UI.Xaml.Controls.TextBlock ovládací prvek pojmenovaný textblock1 v projektu s názvem Reflexe. Pokud tento kód vložíte do projektu s jiným názvem, je nutné změnit název prostoru názvů, tak aby odpovídal vašemu projektu.

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

Viz také