Reflektion in .NET Framework für Windows Store-Apps
Ab .NET Framework 4.5 stellt das .NET Framework eine Reihe von Reflexionstypen und -membern für Windows 8.x Store-Apps zur Verfügung. Diese Typen und Member sind im vollständigen .NET Framework sowie in .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 Reflexionstypen und -member in .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.
TypeInfo und Laden von Assemblys
In .NET für Windows 8.x Store-Apps enthält die Klasse TypeInfo einen Teil der Funktionen der Klasse Type 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 Reflexionseigenschaften 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.
Abfragemethoden
Verwenden Sie in .NET für Windows 8.x Store-Apps die Reflexionseigenschaften, 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.
Beschränkungen
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- 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.
Beispiel
In diesem Beispiel werden die Reflexionstypen 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. Zum Ausführen dieses Codes fügen Sie ihn in eine Codedatei für eine Windows 8.x Store-Seite ein, die ein Steuerelement Windows.UI.Xaml.Controls.TextBlock mit dem Namen textblock1
in einem Projekt namens „Reflection“ (Reflexion) 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();
}
}
}
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