Refleksi dalam .NET Framework untuk Aplikasi Windows Store

Dimulai dengan .NET Framework 4.5, .NET Framework menyertakan serangkaian jenis pantulan dan anggota untuk digunakan di aplikasi Windows 8.x Store. Jenis dan anggota ini tersedia dalam .NET Framework lengkap serta di .NET untuk aplikasi Windows Store. Dokumen ini menjelaskan perbedaan utama antara ini dan rekan-rekan mereka dalam .NET Framework 4 dan versi yang lebih lama.

Jika Anda membuat aplikasi Windows 8.x Store, Anda harus menggunakan tipe dan anggota refleksi dalam .NET untuk aplikasi Windows 8.x Store. Jenis dan anggota ini juga tersedia, tetapi tidak diperlukan, untuk digunakan di aplikasi desktop, sehingga Anda dapat menggunakan kode yang sama untuk kedua jenis aplikasi.

TypeInfo dan Assembly Loading

Di aplikasi .NET untuk Windows 8.x Store, TypeInfo kelas berisi beberapa fungsionalitas kelas .NET Framework 4 Type . Objek Type mewakili referensi ke definisi jenis, sedangkan TypeInfo objek mewakili definisi jenis itu sendiri. Ini memungkinkan Anda memanipulasi Type objek tanpa memerlukan runtime untuk memuat assembly yang mereka referensikan. Mendapatkan objek terkait TypeInfo memaksa rakitan untuk dimuat.

TypeInfo berisi banyak anggota yang tersedia di Type, dan banyak properti refleksi di aplikasi .NET untuk Windows 8.x Store mengembalikan koleksi objek TypeInfo. Untuk mendapatkan TypeInfo objek dari Type objek, gunakan GetTypeInfo metode .

Metode Kueri

Di aplikasi .NET untuk Windows 8.x Store, Anda menggunakan properti refleksi yang mengembalikan koleksi IEnumerable<T> alih-alih metode yang mengembalikan array. Konteks refleksi dapat mengimplementasikan penelusuran malas dari koleksi ini untuk rakitan atau tipe data yang besar.

Properti refleksi hanya mengembalikan metode yang dideklarasikan pada objek tertentu alih-alih melintasi pohon warisan. Selain itu, mereka tidak menggunakan BindingFlags parameter untuk pemfilteran. Sebagai gantinya, pemfilteran terjadi dalam kode pengguna, dengan menggunakan kueri LINQ pada koleksi yang dikembalikan. Untuk objek refleksi yang berasal dari runtime (misalnya, sebagai hasil typeof(Object)), melintasi pohon warisan paling baik dicapai dengan menggunakan metode pembantu dari kelas RuntimeReflectionExtensions. Konsumen objek dari konteks refleksi yang disesuaikan tidak dapat menggunakan metode ini, dan harus menjelajahi pohon pewarisan itu sendiri.

Pembatasan

Dalam aplikasi Windows Store 8.x, akses ke beberapa tipe dan anggota .NET Framework dibatasi. Misalnya, Anda tidak dapat memanggil metode .NET Framework yang tidak disertakan dalam aplikasi .NET untuk Windows 8.x Store, dengan menggunakan MethodInfo objek. Selain itu, jenis dan anggota tertentu yang tidak dianggap aman dalam konteks aplikasi Windows 8.x Store diblokir, seperti halnya anggota Marshal dan WindowsRuntimeMarshal. Pembatasan ini hanya memengaruhi jenis dan anggota .NET Framework; Anda dapat memanggil kode atau kode pihak ketiga seperti biasa.

Contoh

Contoh ini menggunakan tipe dan anggota refleksi pada aplikasi .NET untuk Windows 8.x Store untuk mendapatkan metode dan properti dari tipe Calendar, termasuk metode dan properti yang diwariskan. Untuk menjalankan kode ini, tempelkan ke file kode pada halaman Toko Windows 8.x yang berisi kontrol Windows.UI.Xaml.Controls.TextBlock bernama textblock1 dalam proyek bernama Reflection. Jika Anda menempelkan kode ini di dalam proyek dengan nama yang berbeda, pastikan Anda mengubah nama namespace agar sesuai dengan proyek Anda.

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

Lihat juga