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 penuh serta di aplikasi .NET for Windows Store. Dokumen ini menjelaskan perbedaan utama antara ini dan rekan-rekan mereka di .NET Framework 4 dan versi sebelumnya.

Jika Anda membuat aplikasi Windows 8.x Store, Anda harus menggunakan jenis refleksi dan anggota di aplikasi .NET for 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 Pemuatan Rakitan

Di aplikasi .NET untuk Windows 8.x Store, kelas TypeInfo berisi beberapa fungsionalitas kelas Type .NET Framework 4. Objek Type mewakili referensi terhadap definisi jenis, sedangkan objek TypeInfo mewakili definisi jenis itu sendiri. Ini memungkinkan Anda memanipulasi objek Type tanpa harus memerlukan runtime untuk memuat perakitan yang mereka referensikan. Mendapatkan objek TypeInfo terkait memaksa perakitan 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 objek TypeInfo dari objek Type, gunakan metode GetTypeInfo.

Metode Kueri

Di aplikasi .NET untuk Windows 8.x Store, Anda menggunakan properti pantulan yang mengembalikan koleksi IEnumerable<T> alih-alih metode yang mengembalikan larik. Konteks refleksi dapat menerapkan traversal malas koleksi ini untuk rakitan atau jenis besar.

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

Batasan

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

Contoh

Contoh ini menggunakan tipe dan anggota refleksi di aplikasi .NET untuk Windows 8.x Store untuk mengambil metode dan properti dari tipe Calendar, termasuk metode dan properti yang diwarisi. Untuk menjalankan kode ini, tempelkan ke file kode untuk halaman Windows 8.x Store yang berisi kontrol Windows.UI.Xaml.Controls.TextBlock bernama textblock1 di 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