Отражение в .NET Framework для приложений Магазина Windows

Начиная с платформа .NET Framework 4.5, платформа .NET Framework включает набор типов отражения и членов для использования в приложениях Магазина Windows 8.x. Эти типы и члены доступны в полной версии платформы .NET Framework, а также в .NET для приложений Магазина Windows. В этом документе описаны основные отличия между ними и их аналогами в платформе .NET Framework версии 4 и более ранних версий.

При разработке приложения Магазина Windows 8.x необходимо использовать типы и члены отражения в приложениях .NET для Магазина Windows 8.x. Эти типы и члены также доступны, но не обязательны, для использования в классических приложениях, поэтому можно использовать один и тот же код для обоих типов приложений.

TypeInfo и загрузка сборок

Класс TypeInfo в приложениях .NET для Магазина Windows 8.x содержит некоторые возможности класса Type .NET Framework 4. Объект Type представляет собой ссылку на определение типа, а объект TypeInfo представляет само определение типа. Это позволяет управлять объектами Type без обязательной загрузки средой выполнения сборки, на которую они ссылаются. Получение связанного объекта TypeInfo принудительно загружает сборку.

TypeInfo содержит множество членов, доступных в классе Type, а многие свойства отражения в приложениях .NET для Магазина Windows 8.x возвращают коллекции объектов TypeInfo. Чтобы получить объект TypeInfo из объекта Type, используйте метод GetTypeInfo.

Методы запросов

В приложениях .NET для Магазина Windows 8.x используются свойства отражения, которые возвращают коллекции IEnumerable<T> вместо методов, возвращающих массивы. Контексты отражения могут реализовывать отложенный обход этих коллекций для больших сборок или типов.

Свойства отражения возвращают только методы, объявленные в указанном объекте, а не обходят дерево наследования. Кроме того, они не используют параметры BindingFlags для фильтрации. Фильтрация выполняется в коде пользователя с помощью запросов LINQ к возвращаемым коллекциям. Для объектов отражения, создаваемых средой (например, как результат typeof(Object)), обход дерева наследования лучше выполнять с помощью вспомогательных методов класса RuntimeReflectionExtensions. Потребители объектов из настроенных контекстов отражения не могут использовать эти методы и должны сами выполнять обход дерева наследования.

Ограничения

В приложении для Магазина Windows 8.x доступ к некоторым типам и членам .NET Framework ограничен. Например, вы не можете вызывать методы .NET Framework, не включенные в приложения .NET для Магазина Windows 8.x, с помощью объекта MethodInfo. Кроме того, заблокированы некоторые типы и члены, которые не считаются безопасными в контексте приложения для Магазина Windows 8.x, а также члены Marshal и WindowsRuntimeMarshal. Это ограничение влияет только на типы и члены .NET Framework; свой код или сторонний код можно вызывать как обычно.

Пример

В этом примере с использованием типов и членов отражения в приложениях .NET для Магазина Windows 8.x извлекаются методы и свойства типа Calendar, включая унаследованные методы и свойства. Для запуска этого кода вставьте его в файл кода для страницы Магазина Windows 8.x, которая содержит элемент управления Windows.UI.Xaml.Controls.TextBlock с именем textblock1 в проекте Reflection. При вставке этого кода в проект с другим именем просто убедитесь, что имя пространства имен соответствует вашему проекту.

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

См. также