Windows 스토어 앱에 대한 .NET Framework의 리플렉션

.NET Framework 4.5부터 .NET Framework에는 Windows 8.x 스토어 앱에서 사용할 리플렉션 형식 및 멤버 세트가 포함되어 있습니다. 이러한 형식과 멤버는 전체 .NET Framework와 .NET for Windows 스토어 앱에서 사용할 수 있습니다. 이 문서에서는 이러한 항목과 .NET Framework 4 이전 버전에 있는 해당 항목 간의 주요 차이점을 설명합니다.

Windows 8.x 스토어 앱을 만드는 경우 .NET for Windows 8.x 스토어 앱에서 리플렉션 형식 및 멤버를 사용해야 합니다. 이러한 형식과 멤버를 데스크톱 앱에서 사용할 수도 있지만 필수는 아니므로 두 유형의 앱에 동일한 코드를 사용할 수 있습니다.

TypeInfo 및 어셈블리 로딩

.NET for Windows 8.x 스토어 앱에서 TypeInfo 클래스에는 .NET Framework 4 Type 클래스의 일부 기능이 포함되어 있습니다. Type 개체는 형식 정의에 대한 참조를 나타내는 반면 TypeInfo 개체는 형식 정의 자체를 나타냅니다. 이렇게 하면 런타임에서 참조하는 어셈블리를 로드하지 않고도 Type 개체를 조작할 수 있습니다. 연결된 TypeInfo 개체를 가져오면 어셈블리가 로드됩니다.

TypeInfo에는 Type에서 사용할 수 있는 대부분의 멤버가 포함되고, .NET for Windows 8.x 스토어 앱의 리플렉션 속성은 대부분 TypeInfo 개체 컬렉션을 반환합니다. Type 개체에서 TypeInfo 개체를 가져오려면 GetTypeInfo 메서드를 사용합니다.

쿼리 메서드

.NET for Windows 8.x 스토어 앱에서 배열을 반환하는 메서드 대신 IEnumerable<T> 컬렉션을 반환하는 리플렉션 속성을 사용합니다. 리플렉션 컨텍스트는 큰 어셈블리 또는 형식에 대해 이러한 컬렉션의 지연 순회를 구현할 수 있습니다.

리플렉션 속성은 상속 트리를 트래버스하는 대신 특정 개체에 선언된 메서드만 반환합니다. 또한 BindingFlags 매개 변수를 필터링에 사용하지 않습니다. 대신, 반환된 컬렉션에 대해 LINQ 쿼리를 사용하여 사용자 코드에서 필터링이 수행됩니다. 런타임에 발생하는 리플렉션 개체(예: typeof(Object)의 결과로)의 경우 RuntimeReflectionExtensions 클래스의 도우미 메서드를 사용하면 상속 트리 트래버스가 가장 효과적으로 수행됩니다. 사용자 지정 리플렉션 컨텍스트의 개체 소비자는 이러한 메서드를 사용할 수 없으며, 상속 트리 자체를 트래버스해야 합니다.

제한 사항

Windows 8.x 스토어 앱에서 일부 .NET Framework 형식 및 멤버에 대한 액세스는 제한됩니다. 예를 들어 MethodInfo 개체를 사용하여 .NET for Windows 8.x 스토어 앱에 포함되지 않은 .NET Framework 메서드를 호출할 수 없습니다. 또한 MarshalWindowsRuntimeMarshal 멤버처럼 Windows 8.x 스토어 앱의 컨텍스트 내에서 안전하게 간주되지 않는 특정 형식 및 멤버는 차단됩니다. 이 제한은 .NET Framework 형식 및 멤버에만 영향을 줍니다. 일반적인 방법으로 사용자 코드나 타사 코드를 호출할 수 있습니다.

예시

이 예제에서는 .NET for Windows 8.x 스토어 앱의 리플렉션 형식 및 멤버를 사용하여 상속된 메서드 및 속성을 비롯한 Calendar 형식의 메서드 및 속성을 검색합니다. 이 코드를 실행하려면 리플렉션 프로젝트에서 textblock1이라는 Windows.UI.Xaml.Controls.TextBlock 컨트롤을 포함하는 Windows 8.x 스토어 페이지에 대한 코드 파일에 코드를 붙여넣습니다. 다른 이름을 사용하여 프로젝트에 이 코드를 붙여넣는 경우 프로젝트와 일치하도록 네임스페이스 이름을 변경해야 합니다.

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

참고 항목