Windows Mağazası Uygulamaları için .NET Framework'te Yansıma

.NET Framework 4.5'den başlayarak .NET Framework, Windows 8.x Store uygulamalarında kullanılmak üzere bir yansıma türleri ve üyeleri kümesi içerir. Bu türler ve üyeler hem tam .NET Framework'te hem de Windows Mağazası için .NET uygulamalarında kullanılabilir. Bu belge, bunlar ile .NET Framework 4 ve daha önceki sürümlerdeki karşılıkları arasındaki temel farkları açıklar.

Bir Windows 8.x Store uygulaması oluşturuyorsanız, Windows 8.x Store uygulamaları için .NET'teki yansıma türlerini ve üyeleri kullanmanız gerekir. Bu türler ve üyeler, gerekli olmasa da aynı zamanda masaüstü uygulamalarında kullanılmak üzere mevcuttur, bu nedenle her iki uygulama türü için de aynı kodu kullanabilirsiniz.

TypeInfo ve Derleme Yükleme

Windows 8.x Store için .NET uygulamalarında, TypeInfo sınıfı .NET Framework 4 Type sınıfının bazı işlevlerini içerir. Bir Type nesnesi, tür tanımını kendisi temsil ederken bir TypeInfo nesnesi, tür tanımına bir başvuruyu temsil eder. Bu, başvurdukları derlemenin çalışma zamanı tarafından yüklenmesine gerek olmadan Type nesnelerini işlemenizi sağlar. İlişkili TypeInfo nesnesini almak, derlemeyi yüklenmeye zorlar.

TypeInfo üzerinde Typekullanılabilen üyelerin çoğunu içerir ve Windows 8.x Store uygulamaları için .NET'teki yansıma özelliklerinin çoğu nesne koleksiyonları TypeInfo döndürür. Bir TypeInfo nesnesinden Type nesnesini almak için GetTypeInfo yöntemini kullanın.

Sorgu Yöntemleri

Windows 8.x Store için .NET uygulamalarında, dizi döndüren yöntemler yerine koleksiyonları döndüren IEnumerable<T> yansıma özelliklerini kullanırsınız. Yansıma bağlamları, büyük derlemeler veya türler için bu koleksiyonların yavaş çapraz geçişini uygulayabilir.

Yansıma özellikleri, özel bir nesne için, kalıtım ağacına dönmek yerince yalnızca belirtilen yöntemleri kullanırlar. Ayrıca, filtreleme için BindingFlags parametrelerini kullanmaz. Bunun yerine filtreleme işlemi, döndürülen koleksiyonlarda LINQ sorguları kullanılarak kullanıcı kodu içinde yer alır. Çalışma zamanıyla oluşan yansıma nesneleri için (örneğin, typeof(Object)'in sonucu olarak) devralma ağacının çapraz geçişi en iyi, RuntimeReflectionExtensions sınıfının yardımcı yöntemleri kullanılarak gerçekleştirilir. Özelleştirilmiş yansıma bağlamlarından gelen nesnelerin tüketicileri bu yöntemleri kullanamaz ve kendileri devralma ağacını kendileri geçirmeleri gerekir.

Kısıtlamalar

Windows 8.x Store uygulamasında bazı .NET Framework türlerine ve üyelerine erişim kısıtlanır. Örneğin, bir MethodInfo nesne kullanarak Windows 8.x Store uygulamaları için .NET'e dahil olmayan .NET Framework yöntemlerini çağıramazsınız. Ayrıca, Windows 8.x Store uygulaması bağlamında güvenli kabul edilmeyen belirli türler ve üyeler de ve WindowsRuntimeMarshal üyeler gibi Marshal engellenir. Bu kısıtlama yalnızca .NET Framework türlerini ve üyelerini etkiler; normalde yaptığınız gibi kodunuzu veya üçüncü taraf kodunu çağırabilirsiniz.

Örnek

Bu örnek, devralınan yöntemler ve özellikler de dahil olmak üzere türün yöntemlerini ve özelliklerini Calendar almak için Windows 8.x Store uygulamaları için .NET'teki yansıma türlerini ve üyelerini kullanır. Bu kodu çalıştırmak için, Düşünceler ion adlı projede adlı textblock1 denetimi Windows.UI.Xaml.Controls.TextBlock içeren bir Windows 8.x Mağazası sayfasının kod dosyasına yapıştırın. Bu kodu farklı bir ada sahip bir projenin içine yapıştırırsanız, ad alanı adını projenizle eşleşecek şekilde değiştirdiğinizden emin olun.

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

Ayrıca bkz.