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 popisuje hlavní rozdíly mezi těmito položkami a jejich protějšky v rozhraní .NET Framework 4 a dřívějších verzích.
Pokud vytváříte aplikaci pro Windows 8.x Store, musíte použít typy reflexe a členy v .NET pro aplikace pro Windows 8.x Store. Tyto typy a členy jsou také k dispozici, ačkoli nejsou vyžadovány, pro použití v aplikacích pracovní plochy, takže lze použít stejný kód pro oba typy aplikací.
TypeInfo a načítání sestavení
V .NET pro aplikace TypeInfo pro Windows 8.x Store obsahuje třída některé funkce třídy .NET Framework 4 Type . Objekt Type představuje odkaz na definici typu, zatímco objekt TypeInfo představuje samotnou definici typu. To umožňuje práci s objekty typu Type bez toho, aby modul runtime musel načíst sestavení, na které odkazují. Získání přidruženého objektu TypeInfo vynutí 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ů. Chcete-li získat objekt 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 pro velká sestavení nebo typy implementovat opožděné procházení těchto kolekcí.
Vlastnosti reflexe vrací pouze metody deklarované pro daný objekt namísto procházení stromu dědičnosti. Kromě toho nelze pro filtrování použít parametry BindingFlags. Namísto toho filtrování probíhá na vrácené kolekci v uživatelském kódu pomocí dotazů LINQ. Pro objekty reflexe modulu runtime (například výsledek výrazu typeof(Object)
) je procházení stromu dědičnosti provedeno nejlépe prostřednictvím pomocných metod třídy RuntimeReflectionExtensions. Spotřebitelé objektů z vlastních kontextů reflexe nemohou tyto metody použít a musí strom dědičnosti procházet sami.
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 členy, které nejsou považovány za bezpečné v kontextu aplikace pro Windows 8.x Store, blokované stejně jako MarshalWindowsRuntimeMarshal členové. Toto omezení se týká pouze typů a členů rozhraní .NET Framework. Váš kód nebo kód třetích stran lze volat jako obvykle.
Příklad
Tento příklad používá typy reflexe a členy v aplikacích .NET pro Windows 8.x Store k načtení metod a vlastností Calendar typu, 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 ion. Pokud tento kód vložíte do projektu s jiným názvem, stačí změnit název oboru 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