Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с .NET Framework 4.5 платформа .NET Framework включает набор типов отражения и членов для использования в приложениях Магазина Windows 8.x. Эти типы и члены доступны как в полной версии .NET Framework, так и в .NET для приложений Windows Store. В этом документе объясняется основные различия между этими и их коллегами в .NET Framework 4 и более ранних версиях.
Если вы создаете приложение для Магазина Windows 8.x, вы должны использовать типы и члены отражения в .NET для этих приложений. Эти типы и члены также доступны, но не требуются для использования в классических приложениях, поэтому можно использовать один и тот же код для обоих типов приложений.
Загрузка TypeInfo и сборок
В приложениях Магазина Windows 8.x на базе .NET класс TypeInfo включает частичную функциональность класса 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