Windows ストア アプリのための .NET Framework のリフレクション

.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 で使用できるメンバーの多くが含まれ、Windows 8.x ストア アプリ用 .NET のリフレクション プロパティの多くでは TypeInfo オブジェクトのコレクションが返されます。 TypeInfo オブジェクトから Type オブジェクトを取得するには、GetTypeInfo メソッドを使用します。

クエリ メソッド

Windows 8.x ストア アプリ用 .NET では、配列を返すメソッドではなく、IEnumerable<T> コレクションを返すリフレクション プロパティを使用します。 リフレクション コンテキストは、大型のアセンブリまたは型用に、これらのコレクションの限定的な走査を実装できます。

リフレクション プロパティは、継承ツリーを走査する代わりに、特定オブジェクトの宣言されたメソッドのみを返します。 また、フィルター処理に BindingFlags パラメーターを使用しません。 代わりに、返されるコレクションで LINQ クエリを使用することにより、フィルター処理をユーザー コード内で発生させます。 (typeof(Object) の結果などにより) ランタイムから始まるリフレクション オブジェクトの場合、継承ツリーを走査するには RuntimeReflectionExtensions クラスのヘルパー メソッドを使用するのが最も適切です。 カスタマイズされたリフレクション コンテキストのオブジェクトのコンシューマーは、これらのメソッドを使用できず、独自に継承ツリーを走査する必要があります。

制約

Windows 8.x ストア アプリでは、.NET Framework の一部の型とメンバーへのアクセスが制限されます。 たとえば、MethodInfo オブジェクトを使用して、Windows 8.x ストア アプリ用 .NET に含まれない .NET Framework のメソッドを呼び出すことはできません。 また、Marshal メンバーおよび WindowsRuntimeMarshal メンバーと同様に、Windows 8.x ストア アプリのコンテキストで安全とは見なされない特定の型およびメンバーはブロックされます。 この制限は、.NET Framework の型とメンバーにのみ適用されます。ユーザー コードやサードパーティ コードは通常どおり呼び出すことができます。

この例では、Windows 8.x ストア アプリ用 .NET のリフレクション型とメンバーを使用して、Calendar 型のメソッドとプロパティを、継承されたメソッドとプロパティも含めて取得します。 このコードを実行するには、Reflection という名前のプロジェクトの 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

関連項目