.NET Framework 4.5부터 .NET Framework에는 Windows 8.x 스토어 앱에서 사용할 리플렉션 형식 및 멤버 집합이 포함되어 있습니다. 이러한 형식 및 멤버는 전체 .NET Framework 및 Windows 스토어 앱용 .NET에서 사용할 수 있습니다. 이 문서에서는 .NET Framework 4 및 이전 버전에서 이러한 항목과 해당 버전 간의 주요 차이점을 설명합니다.
Windows 8.x 스토어 앱을 만드는 경우 Windows 8.x 스토어 앱용 .NET에서 리플렉션 형식 및 멤버를 사용해야 합니다. 이러한 형식 및 멤버도 데스크톱 앱에서 사용할 수 있지만 필수는 아니므로 두 앱 유형 모두에 대해 동일한 코드를 사용할 수 있습니다.
TypeInfo 및 어셈블리 로딩
Windows 8.x 스토어 앱용 .NET에서 TypeInfo 클래스는 .NET Framework 4 Type 클래스의 일부 기능을 포함하고 있습니다. Type 개체는 형식 정의에 대한 참조를 나타내는 반면TypeInfo, 개체는 형식 정의 자체를 나타냅니다. 이렇게 하면 런타임에서 참조하는 어셈블리를 로드할 필요 없이 개체를 조작 Type 할 수 있습니다. 연결된 TypeInfo 개체를 가져오면 어셈블리가 강제로 로드됩니다.
TypeInfo에는 Type에서 사용 가능한 많은 멤버가 포함되어 있으며, .NET의 Windows 8.x 스토어 앱에서 여러 리플렉션 속성은 TypeInfo 객체의 컬렉션을 반환합니다. TypeInfo 개체를 Type 개체에서 얻으려면 GetTypeInfo 메서드를 사용합니다.
쿼리 메서드
Windows 8.x 스토어 앱용 .NET에서는 배열을 반환하는 메서드 대신 컬렉션을 반환 IEnumerable<T> 하는 리플렉션 속성을 사용합니다. 리플렉션 컨텍스트는 큰 어셈블리 또는 형식에 대해 이러한 컬렉션의 지연 통과를 구현할 수 있습니다.
리플렉션 속성은 상속 트리를 트래버스하는 대신 특정 개체에 대해 선언된 메서드만 반환합니다. 또한, 그들은 필터링에 매개 변수를 사용하지 않습니다 BindingFlags. 대신 반환된 컬렉션에서 LINQ 쿼리를 사용하여 사용자 코드에서 필터링이 이루어집니다. 런타임에서 생성된 리플렉션 객체(예: typeof(Object)
의 결과)의 경우 RuntimeReflectionExtensions 클래스의 도우미 메서드를 사용하여 상속 트리를 탐색하는 것이 가장 좋습니다. 사용자 지정된 리플렉션 컨텍스트의 개체 소비자는 이러한 메서드를 사용할 수 없으며 상속 트리 자체를 트래버스해야 합니다.
제한 사항
Windows 8.x 스토어 앱에서는 일부 .NET Framework 형식 및 멤버에 대한 액세스가 제한됩니다. 예를 들어 개체를 사용하여 Windows 8.x 스토어 앱용 .NET에 포함되지 않은 .NET Framework 메서드를 MethodInfo 호출할 수 없습니다. 또한 Windows 8.x 스토어 앱의 컨텍스트 내에서 안전하다고 간주되지 않는 특정 형식 및 멤버와 Marshal 및 WindowsRuntimeMarshal 멤버가 차단됩니다. 이 제한은 .NET Framework 형식 및 멤버에만 영향을 줍니다. 평소처럼 코드 또는 타사 코드를 호출할 수 있습니다.
예시
이 예제에서는 Windows 8.x 스토어 앱용 .NET에서 리플렉션 형식 및 멤버를 사용하여 상속된 메서드 및 속성을 포함하여 형식의 Calendar 메서드와 속성을 검색합니다. 이 코드를 실행하려면 리플렉션이라는 프로젝트에 명명된 Windows.UI.Xaml.Controls.TextBlock 컨트롤이 포함된 textblock1
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
참고하십시오
.NET