Dela via


Reflektion i .NET Framework för Windows Store-appar

Från och med .NET Framework 4.5 innehåller .NET Framework en uppsättning reflektionstyper och medlemmar för användning i Windows 8.x Store-appar. Dessa typer och medlemmar är tillgängliga i hela .NET Framework samt i .NET för Windows Store-appar. Det här dokumentet förklarar de stora skillnaderna mellan dessa och deras motsvarigheter i .NET Framework 4 och tidigare versioner.

Om du skapar en Windows 8.x Store-app måste du använda reflektionstyperna och medlemmarna i .NET för Windows 8.x Store-appar. Dessa typer och medlemmar är också tillgängliga, men krävs inte, för användning i skrivbordsappar, så du kan använda samma kod för båda typerna av appar.

TypeInfo och sammansättningsinläsning

I .NET för Windows 8.x Store-appar TypeInfo innehåller klassen några av funktionerna i .NET Framework 4-klassen Type . Ett Type objekt representerar en referens till en typdefinition, medan ett TypeInfo objekt representerar själva typdefinitionen. På så sätt kan du ändra Type objekt utan att nödvändigtvis kräva körningen för att läsa in den sammansättning som de refererar till. Att hämta det associerade TypeInfo objektet tvingar sammansättningen att läsas in.

TypeInfo innehåller många av de medlemmar som är tillgängliga på Type, och många av reflektionsegenskaperna i .NET för Windows 8.x Store-appar returnerar samlingar med TypeInfo objekt. Om du vill hämta ett TypeInfo objekt från ett Type objekt använder du GetTypeInfo -metoden.

Frågemetoder

I .NET för Windows 8.x Store-appar använder du de reflektionsegenskaper som returnerar IEnumerable<T> samlingar i stället för metoder som returnerar matriser. Reflektionskontexter kan implementera lat bläddering av dessa samlingar för stora sammansättningar eller typer.

Reflektionsegenskaperna returnerar endast de deklarerade metoderna för ett visst objekt i stället för att gå igenom arvsträdet. Dessutom använder BindingFlags de inte parametrar för filtrering. I stället sker filtrering i användarkod med hjälp av LINQ-frågor i de returnerade samlingarna. För reflektionsobjekt som har sitt ursprung i körningen (till exempel som ett resultat av typeof(Object)) är det bäst att bläddra i arvsträdet med hjälp av hjälpmetoderna i RuntimeReflectionExtensions klassen. Användare av objekt från anpassade reflektionskontexter kan inte använda dessa metoder och måste själva passera arvsträdet.

Begränsningar

I en Windows 8.x Store-app är åtkomsten till vissa .NET Framework-typer och medlemmar begränsad. Du kan till exempel inte anropa .NET Framework-metoder som inte ingår i .NET för Windows 8.x Store-appar med hjälp av ett MethodInfo -objekt. Dessutom blockeras vissa typer och medlemmar som inte anses vara säkra inom ramen för en Windows 8.x Store-app, liksom Marshal medlemmar WindowsRuntimeMarshal . Den här begränsningen påverkar endast .NET Framework-typer och -medlemmar. du kan anropa din kod eller kod från tredje part som vanligt.

Exempel

I det här exemplet används reflektionstyperna och medlemmarna i .NET för Windows 8.x Store-appar för att hämta metoderna och egenskaperna för Calendar typen, inklusive ärvda metoder och egenskaper. Om du vill köra den här koden klistrar du in den i kodfilen för en Windows 8.x Store-sida som innehåller en Windows.UI.Xaml.Controls.TextBlock kontroll med namnet textblock1 i ett projekt med namnet Reflektion. Om du klistrar in den här koden i ett projekt med ett annat namn måste du bara ändra namnområdesnamnet så att det matchar projektet.

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

Se även