リフレクションの概要
更新 : 2007 年 11 月
共通言語ランタイム ローダーは、アプリケーション ドメインを管理します。アプリケーション ドメインとは、同じアプリケーション スコープのオブジェクトの周りに構成された定義済みの境界です。アプリケーション ドメインの管理には、該当アプリケーション ドメインへの各アセンブリの読み込み、および各アセンブリ内の型階層のメモリ レイアウトの制御などが含まれます。
アセンブリには、モジュールが含まれています。モジュールには、型が含まれています。また、型にはメンバが含まれています。リフレクションは、アセンブリ、モジュール、および型をカプセル化するオブジェクトを提供します。リフレクションを使用すると、動的に型のインスタンスを作成したり、作成したインスタンスを既存のオブジェクトにバインドしたり、既存のオブジェクトから型を取得できます。その後で、型のメソッドを呼び出したり、型のフィールドやプロパティにアクセスできます。リフレクションの代表的な用途は、次のとおりです。
Assembly を使用して、アセンブリを定義または読み込み、アセンブリ マニフェストにリストされているモジュールを読み込み、そのアセンブリから型を検索し、そのインスタンスを作成します。
モジュールを含んでいるアセンブリや、モジュール内のクラスなどの情報を探索するには、Module を使用します。また、すべてのグローバル メソッドも取得できます。その他、モジュールに定義されている固有の非グローバルなメソッドも取得できます。
名前、パラメータ、アクセス修飾子 (public または private など)、およびコンストラクタの実装詳細 (abstract または virtual など) の情報を探索するには、ConstructorInfo を使用します。特定のコンストラクタを呼び出すには、Type の GetConstructors メソッドまたは GetConstructor メソッドを使用します。
名前、戻り値の型、パラメータ、アクセス修飾子 (public または private など)、およびメソッドの実装詳細 (abstract または virtual など) の情報を探索するには、MethodInfo を使用します。特定のメソッドを呼び出すには、Type の GetMethods メソッドまたは GetMethod メソッドを使用します。
フィールドの名前、アクセス修飾子 (public または private など)、フィールドの実装詳細 (static など) などの情報を探索したり、フィールドの値を取得または設定したりするには、FieldInfo を使用します。
名前、イベント ハンドラのデータ型、カスタム属性、宣言型、イベントのリフレクションされた型などの情報を探索したり、イベント ハンドラを追加および削除したりするには、EventInfo を使用します。
プロパティの名前、データ型、宣言型、リフレクションされた型、読み取り専用または書き込み可能のステータスなどの情報を探索したり、プロパティの値を取得または設定したりするには、PropertyInfo を使用します。
パラメータの名前、データ型、パラメータが入力パラメータか出力パラメータかなどの情報を探索したり、メソッド シグネチャ内のパラメータの位置を探索したりするには、ParameterInfo を使用します。
アプリケーション ドメインのリフレクション専用のコンテキストで作業する際に、カスタム属性に関する情報を検索するには、CustomAttributeData を使用します。CustomAttributeData を使用すると、それらのインスタンスを作成せずに属性を調べることができます。
System.Reflection.Emit 名前空間のクラスは、実行時に型を作成できる特殊な形態のリフレクションを提供します。
また、リフレクションを使用すると、型を選択し、型についての情報を表示できる、型ブラウザと呼ばれるアプリケーションを作成することもできます。
リフレクションには、他の用途もあります。JScript のような言語のコンパイラは、リフレクションを使用してシンボル テーブルを構築します。System.Runtime.Serialization 名前空間のクラスは、リフレクションを使用して、データにアクセスし、永続化するフィールドを決定します。System.Runtime.Remoting 名前空間のクラスは、シリアル化を通じて間接的にリフレクションを使用します。