Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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