次の方法で共有


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 オブジェクトのコレクションを返します。 TypeInfo オブジェクトからType オブジェクトを取得するには、GetTypeInfo メソッドを使用します。

クエリ メソッド

Windows 8.x ストア アプリの .NET では、配列を返すメソッドではなく、 IEnumerable<T> コレクションを返すリフレクション プロパティを使用します。 リフレクション コンテキストでは、大規模なアセンブリまたは型に対してこれらのコレクションの遅延トラバーサルを実装できます。

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

制約

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

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

こちらも参照ください