Share via


Weerspiegeling in .NET Framework voor Windows Store-apps

Vanaf .NET Framework 4.5 bevat .NET Framework een reeks reflectietypen en leden voor gebruik in Windows 8.x Store-apps. Deze typen en leden zijn beschikbaar in het volledige .NET Framework en in de .NET voor Windows Store-apps. In dit document worden de belangrijkste verschillen tussen deze en hun tegenhangers in .NET Framework 4 en eerdere versies uitgelegd.

Als u een Windows 8.x Store-app maakt, moet u de weerspiegelingstypen en leden in de .NET voor Windows 8.x Store-apps gebruiken. Deze typen en leden zijn ook beschikbaar, maar zijn niet vereist voor gebruik in desktop-apps, zodat u dezelfde code voor beide typen apps kunt gebruiken.

TypeInfo en assembly laden

In de .NET voor Windows 8.x Store-apps bevat de TypeInfo klasse een deel van de functionaliteit van de .NET Framework 4-klasse Type . Een Type object vertegenwoordigt een verwijzing naar een typedefinitie, terwijl een TypeInfo object de typedefinitie zelf vertegenwoordigt. Hierdoor kunt u objecten bewerken Type zonder dat de runtime de assembly waarnaar ze verwijzen hoeft te laden. Als u het bijbehorende TypeInfo object ophaalt, wordt de assembly gedwongen om te laden.

TypeInfo bevat veel van de leden die beschikbaar zijn op Typeen veel van de reflectie-eigenschappen in de .NET voor Windows 8.x Store-apps retourneren verzamelingen objecten TypeInfo . Gebruik de GetTypeInfo methode om een TypeInfo object op te halen uit een Type object.

Querymethoden

In de .NET voor Windows 8.x Store-apps gebruikt u de weerspiegelingseigenschappen die verzamelingen retourneren IEnumerable<T> in plaats van methoden die matrices retourneren. Reflectiecontexten kunnen luie doorkruising van deze verzamelingen implementeren voor grote assembly's of typen.

De weerspiegelingseigenschappen retourneren alleen de gedeclareerde methoden voor een bepaald object in plaats van de overnamestructuur te doorlopen. Bovendien gebruiken BindingFlags ze geen parameters voor het filteren. In plaats daarvan vindt filteren plaats in gebruikerscode, met behulp van LINQ-query's op de geretourneerde verzamelingen. Voor weerspiegelingsobjecten die afkomstig zijn van de runtime (bijvoorbeeld als gevolg van typeof(Object)), kunt u het beste de overnamestructuur doorkruisen met behulp van de helpermethoden van de RuntimeReflectionExtensions klasse. Consumenten van objecten uit aangepaste reflectiecontexten kunnen deze methoden niet gebruiken en moeten de overnamestructuur zelf doorlopen.

Beperkingen

In een Windows 8.x Store-app is de toegang tot sommige .NET Framework-typen en leden beperkt. U kunt bijvoorbeeld geen .NET Framework-methoden aanroepen die niet zijn opgenomen in .NET voor Windows 8.x Store-apps met behulp van een MethodInfo object. Daarnaast worden bepaalde typen en leden die niet als veilig worden beschouwd binnen de context van een Windows 8.x Store-app geblokkeerd, net als MarshalWindowsRuntimeMarshal leden. Deze beperking is alleen van invloed op .NET Framework-typen en -leden; u kunt uw code of code van derden aanroepen zoals u dat normaal zou doen.

Opmerking

In dit voorbeeld worden de weerspiegelingstypen en leden in de .NET voor Windows 8.x Store-apps gebruikt om de methoden en eigenschappen van het Calendar type op te halen, waaronder overgenomen methoden en eigenschappen. Als u deze code wilt uitvoeren, plakt u deze in het codebestand voor een Windows 8.x Store-pagina met een besturingselement met de Windows.UI.Xaml.Controls.TextBlock naam textblock1 Weerspiegeling in een project. Als u deze code in een project met een andere naam plakt, moet u ervoor zorgen dat u de naamruimtenaam wijzigt zodat deze overeenkomt met uw project.

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

Zie ook