System.Reflection名前空間内のクラスをSystem.Typeと共に使用すると、読み込まれたアセンブリとその中で定義されている型 (クラス、インターフェイス、値型 ( 構造体と列挙型) など) に関する情報を取得できます。 リフレクションを使用して、実行時に型インスタンスを作成し、それらを呼び出してアクセスすることもできます。
アセンブリ にはモジュール、モジュールには型、型にはメンバーが含まれます。 リフレクションは、アセンブリ、モジュール、および型をカプセル化するオブジェクトを提供します。 リフレクションを使用すると、型のインスタンスを動的に作成したり、型を既存のオブジェクトにバインドしたり、既存のオブジェクトから型を取得したりできます。 その後、型のメソッドを呼び出すか、そのフィールドとプロパティにアクセスできます。 リフレクションの一般的な用途は次のとおりです。
- Assemblyを使用してアセンブリを定義および読み込み、アセンブリ マニフェストに一覧表示されているモジュールを読み込み、このアセンブリから型を見つけてインスタンスを作成します。
- Moduleを使用して、モジュールを含むアセンブリやモジュール内のクラスなどの情報を検出します。 また、モジュールで定義されているすべてのグローバル メソッドまたはその他の特定の非グローバル メソッドを取得することもできます。
-
ConstructorInfoを使用して、コンストラクターの名前、パラメーター、アクセス修飾子 (
public
やprivate
など)、実装の詳細 (abstract
やvirtual
など) などの情報を検出します。 特定のコンストラクターを呼び出すには、TypeのGetConstructorsまたはGetConstructorメソッドを使用します。 -
MethodInfoを使用して、メソッドの名前、戻り値の型、パラメーター、アクセス修飾子、実装の詳細 (
abstract
やvirtual
など) などの情報を検出します。 特定のメソッドを呼び出すには、TypeのGetMethodsまたはGetMethodメソッドを使用します。 -
FieldInfoを使用して、フィールドの名前、アクセス修飾子、実装の詳細 (
static
など) などの情報を検出し、フィールド値を取得または設定します。 - EventInfoを使用して、名前、イベント ハンドラーデータ型、カスタム属性、宣言型、イベントの反映型などの情報を検出し、イベント ハンドラーを追加または削除します。
- PropertyInfoを使用して、プロパティの名前、データ型、宣言型、反映型、読み取り専用または書き込み可能な状態などの情報を検出し、プロパティ値を取得または設定します。
- ParameterInfoを使用して、パラメーターの名前、データ型、パラメーターが入力パラメーターか出力パラメーターか、メソッド シグネチャ内のパラメーターの位置などの情報を検出します。
- CustomAttributeDataを使用して、MetadataLoadContextまたはリフレクションのみのコンテキスト (.NET Framework) で作業しているときにカスタム属性に関する情報を検出します。 CustomAttributeData を使用すると、それらのインスタンスを作成せずに属性を調べることができます。
System.Reflection.Emit名前空間のクラスは、実行時に型をビルドできるようにする特殊な形式のリフレクションを提供します。
リフレクションを使用して 型ブラウザーを作成することもできます。これにより、ユーザーは型を選択し、それらの型に関する情報を表示できます。
リフレクションには他にも用途があります。 JScript などの言語のコンパイラは、リフレクションを使用してシンボル テーブルを構築します。 System.Runtime.Serialization名前空間のクラスは、リフレクションを使用してデータにアクセスし、保持するフィールドを決定します。 System.Runtime.Remoting名前空間のクラスは、シリアル化によって間接的にリフレクションを使用します。
リフレクション内のランタイム型
リフレクションは、型、メンバー、パラメーター、およびその他のコード エンティティを表すクラス ( Type や MethodInfoなど) を提供します。 ただし、リフレクションを使用する場合は、これらのクラスを直接操作しません。そのほとんどは抽象 (Visual Basic ではMustInherit
)。 代わりに、共通言語ランタイム (CLR) によって提供される型を操作します。
たとえば、C# typeof
演算子 (Visual Basic では GetType
) を使用して Type オブジェクトを取得する場合、オブジェクトは実際には RuntimeType
です。
RuntimeType
は Type から派生し、すべての抽象メソッドの実装を提供します。
これらのランタイム クラスは internal
されます (Visual Basic ではFriend
)。 基底クラスの動作は基底クラスのドキュメントで説明されているため、基底クラスとは別に記述されていません。
リファレンス
.NET