.NET のリフレクション

System.Reflection 名前空間内のクラスを System.Type と共に使用すると、読み込まれたアセンブリについての情報、およびそのアセンブリ内に定義されているクラスインターフェイス、値型 (つまり、構造体列挙) などの型を取得できます。 また、リフレクションを使用すると、実行時に型インスタンスを作成したり、作成した型インスタンスを呼び出したり、アクセスしたりできます。

アセンブリには、モジュールが含まれています。モジュールには、型が含まれています。また、型にはメンバーが含まれています。 リフレクションは、アセンブリ、モジュール、および型をカプセル化するオブジェクトを提供します。 リフレクションを使用すると、動的に型のインスタンスを作成したり、その型を既存のオブジェクトにバインドしたり、既存のオブジェクトから型を取得できます。 その後で、型のメソッドを呼び出したり、型のフィールドやプロパティにアクセスしたりできます。 リフレクションの代表的な用途は、次のとおりです。

  • Assembly を使用して、アセンブリを定義または読み込み、アセンブリ マニフェストにリストされているモジュールを読み込み、そのアセンブリから型を検索し、そのインスタンスを作成します。
  • モジュールを含んでいるアセンブリや、モジュール内のクラスなどの情報を探索するには、Module を使用します。 また、すべてのグローバル メソッドも取得できます。その他、モジュールに定義されている固有の非グローバルなメソッドも取得できます。
  • 名前、パラメーター、アクセス修飾子 (public または private など)、およびコンストラクターの実装詳細 (abstract または virtual など) の情報を探索するには、ConstructorInfo を使用します。 特定のコンストラクターを呼び出すには、TypeGetConstructors メソッドまたは GetConstructor メソッドを使用します。
  • メソッドの名前、戻り値の型、パラメータ、アクセス修飾子、実装の詳細 (abstract または virtual など) の情報を検出するには、MethodInfo を使用します。 特定のメソッドを呼び出すには、TypeGetMethods メソッドまたは GetMethod メソッドを使用します。
  • フィールドの名前、アクセス修飾子、フィールドの実装の詳細 (static など) などの情報を検出したり、フィールドの値を取得または設定したりするには、FieldInfo を使用します。
  • 名前、イベント ハンドラーのデータ型、カスタム属性、宣言型、イベントのリフレクションされた型などの情報を探索したり、イベント ハンドラーを追加および削除したりするには、EventInfo を使用します。
  • プロパティの名前、データ型、宣言型、リフレクションされた型、読み取り専用または書き込み可能のステータスなどの情報を探索したり、プロパティの値を取得または設定したりするには、PropertyInfo を使用します。
  • パラメーターの名前、データ型、パラメーターが入力パラメーターか出力パラメーターかなどの情報を探索したり、メソッド シグネチャ内のパラメーターの位置を探索したりするには、ParameterInfo を使用します。
  • MetadataLoadContext またはリフレクション専用のコンテキスト (.NET Framework) で作業する際に、カスタム属性に関する情報を検出するには、CustomAttributeData を使用します。 CustomAttributeData を使用すると、それらのインスタンスを作成せずに属性を調べることができます。

System.Reflection.Emit 名前空間のクラスは、実行時に型を作成できる特殊な形態のリフレクションを提供します。

また、リフレクションを使用すると、ユーザーが型を選択し、それらの型についての情報を表示できる、"型ブラウザー" を作成することもできます。

リフレクションには、他の用途もあります。 JScript のような言語のコンパイラは、リフレクションを使用してシンボル テーブルを構築します。 System.Runtime.Serialization 名前空間のクラスは、リフレクションを使用して、データにアクセスし、永続化するフィールドを決定します。 System.Runtime.Remoting 名前空間のクラスは、シリアル化を通じて間接的にリフレクションを使用します。

リフレクションのランタイム型

リフレクションは TypeMethodInfo などのクラスを提供して、型、メンバー、パラメーター、およびその他のコード エンティティを示します。 ただし、リフレクションを使用する場合は、これらのクラスを直接利用しません。これらの大部分は抽象 (Visual Basic では MustInherit) です。 代わりに、共通言語ランタイム (CLR) によって提供される型を利用します。

たとえば、C# typeof 演算子 (Visual Basic では GetType) を使用して Type オブジェクトを取得する場合、オブジェクトは実際には RuntimeType です。 RuntimeTypeType から派生し、すべての抽象メソッドの実装を提供します。

これらのランタイム クラスは internal (Visual Basic では Friend) です。 それらは基本クラスと別のドキュメントでは説明していません。それらの動作は基本クラスのドキュメントで説明されています。

リファレンス