Markieren Sie das Kontrollkästchen Englisch, um die englische Version dieses Artikels anzuzeigen. Sie können den englischen Text auch in einem Popup-Fenster einblenden, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Reflection in the .NET Framework for Windows Store Apps

.NET Framework (current version)
 

Ab .NET Framework 4.5 stellt .NET Framework eine Reihe von Reflektionstypen und -membern für Windows 8.x Store-Apps zur Verfügung.  Diese Typen und Member sind im vollständigen .NET Framework sowie im .NET für Windows Store-Apps verfügbar.  In diesem Dokument werden die Hauptunterschiede zwischen ihnen und ihren Entsprechungen in .NET Framework 4 und früheren Versionen erklärt.  

Wenn Sie eine Windows 8.x Store-App erstellen, müssen Sie die Reflektionstypen und -member im .NET für Windows 8.x Store-Apps verwenden.  Diese Typen und Member sind ebenfalls für die Verwendung in Desktop-Apps verfügbar, jedoch nicht erforderlich, sodass Sie denselben Code für beide Typen von Apps verwenden können.  

In .NET für Windows 8.x Store-Apps enthält die TypeInfo-Klasse einen Teil der Funktionen der Type-Klasse von .NET Framework 4.  Ein Type-Objekt stellt einen Verweis auf eine Typdefinition dar, während ein TypeInfo-Objekt die Typdefinition selbst darstellt.  Dadurch können Sie Type-Objekte ändern, ohne dass die Laufzeit unbedingt die Assembly laden muss, auf die sie verweisen.  Das Abrufen des zugeordneten TypeInfo-Objekts erzwingt das Laden der Assembly.  

TypeInfo enthält viele der Member, die in Type verfügbar sind, und viele der Reflektionseigenschaften in .NET für Windows 8.x Store-Apps geben Auflistungen von TypeInfo-Objekten zurück.  Um ein TypeInfo-Objekt aus einem Type-Objekt abzurufen, verwenden Sie die GetTypeInfo-Methode.  

Verwenden Sie in .NET für Windows 8.x Store-Apps die Reflektionseigenschaften, die IEnumerable<T>-Auflistungen zurückgeben, anstelle von Methoden, die Arrays zurückgeben.  Reflektionskontexte können einen verzögerten Durchlauf dieser Auflistungen für große Assemblys oder Typen implementieren.  

Die Reflektionseigenschaften geben nur die deklarierten Methoden für ein bestimmtes Objekt wieder. Sie durchlaufen nicht die Vererbungsstruktur.  Darüber hinaus verwenden sie keine BindingFlags-Parameter zum Filtern.  Stattdessen wird das Filtern im Benutzercode ausgeführt, indem LINQ-Abfragen für die zurückgegebenen Auflistungen verwendet werden.  Für Reflektionsobjekte, die mit der Laufzeit ausgelöst werden (z. B. als Ergebnis von typeof(Object)), wird das Durchlaufen der Vererbungsstruktur am besten erreicht, indem die Hilfsmethoden der RuntimeReflectionExtensions-Klasse verwendet werden.  Consumer von Objekten benutzerdefinierter Reflektionskontexte können diese Methoden nicht verwenden und müssen selbst die Vererbungsstruktur durchlaufen.  

In einer Windows 8.x Store-App wird der Zugriff auf einige .NET Framework-Typen und -Member eingeschränkt.  Sie können beispielsweise .NET Framework-Methoden, die nicht in .NET für Windows 8.x Store-Apps enthalten sind, nicht mit einem MethodInfo-Objekt aufrufen.  Darüber hinaus werden bestimmte Typen und Member, die innerhalb einer Windows 8.x Store-App als nicht sicher eingestuft werden, sowie Marshal-Member und WindowsRuntimeMarshal-Member blockiert.  Diese Einschränkung betrifft nur .NET Framework-Typen und -Member. Sie können Ihren Code oder Code von Drittanbietern wie gewohnt aufrufen.  

In diesem Beispiel werden die Reflektionstypen und -member in .NET für Windows 8.x Store-Apps verwendet, um die Methoden und Eigenschaften des Calendar-Typs abzurufen (einschließlich geerbter Methoden und Eigenschaften).  Um diesen Code auszuführen, fügen Sie ihn in die Codedatei für eine Windows 8.x Store-Seite ein, die in einem Projekt namens "Reflection" ein Windows.UI.Xaml.Controls.Textblock-Steuerelement namens textblock1 enthält.  Wenn Sie diesen Code in einem Projekt mit einem anderen Namen einfügen, müssen Sie darauf achten, dass Sie den Namespacenamen entsprechend Ihrem Projekt ändern.  

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();

        }
    }
}
Anzeigen: