次の方法で共有


System.Reflection.Emit.TypeBuilder クラス

この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。

TypeBuilder は、ランタイムでの動的クラスの作成を制御するために使用されるルート クラスです。 クラスの定義、メソッドとフィールドの追加、モジュール内でのクラスの作成に使用されるルーチンのセットを提供します。 TypeBuilder オブジェクトを返すModuleBuilder.DefineType メソッドを呼び出すことで、動的モジュールから新しいTypeBuilderを作成できます。

リフレクション出力には、型を定義するための次のオプションが用意されています。

  • 指定された名前を持つクラスまたはインターフェイスを定義します。
  • 指定された名前と属性を使用してクラスまたはインターフェイスを定義します。
  • 指定された名前、属性、および基底クラスを使用してクラスを定義します。
  • 指定された名前、属性、基底クラス、およびクラスが実装するインターフェイスのセットを持つクラスを定義します。
  • 指定された名前、属性、基本クラス、およびパッキング サイズを持つクラスを定義します。
  • 指定された名前、属性、基底クラス、およびクラス サイズ全体を持つクラスを定義します。
  • 指定された名前、属性、基底クラス、パッキング サイズ、およびクラス サイズ全体を使用してクラスを定義します。

TypeBuilder オブジェクトによって表される不完全な型の配列型、ポインター型、または byref 型を作成するには、MakeArrayType メソッド、MakePointerType メソッド、または MakeByRefType メソッドをそれぞれ使用します。

型を使用する前に、 TypeBuilder.CreateType メソッドを呼び出す必要があります。 CreateType は、型の作成を完了します。 CreateType の呼び出しの後、呼び出し元は、Activator.CreateInstance メソッドを使用して型をインスタンス化し、Type.InvokeMember メソッドを使用して型のメンバーを呼び出すことができます。 CreateType が呼び出された後に型の実装を変更するメソッドを呼び出すとエラーになります。 たとえば、呼び出し元が新しいメンバーを型に追加しようとすると、共通言語ランタイムによって例外が発生します。

クラス初期化子は、 TypeBuilder.DefineTypeInitializer メソッドを使用して作成されます。 DefineTypeInitializer は、 ConstructorBuilder オブジェクトを返します。

入れ子になった型は、 TypeBuilder.DefineNestedType メソッドのいずれかを呼び出すことによって定義されます。

属性

TypeBuilder クラスは、TypeAttributes列挙型を使用して、作成する型の特性をさらに指定します。

  • インターフェイスは、 TypeAttributes.Interface 属性と TypeAttributes.Abstract 属性を使用して指定されます。
  • 具象クラス (拡張できないクラス) は、 TypeAttributes.Sealed 属性を使用して指定します。
  • 型の可視性は、いくつかの属性によって決まります。 TypeAttributes列挙体の説明を参照してください。
  • TypeAttributes.SequentialLayoutが指定されている場合、クラス ローダーはメタデータから読み取られた順序でフィールドをレイアウトします。 クラス ローダーは、指定されたパッキング サイズを考慮しますが、指定されたフィールド オフセットは無視します。 メタデータは、フィールド定義が出力される順序を保持します。 マージしても、メタデータはフィールド定義の順序を変更しません。 ローダーは、 TypeAttributes.ExplicitLayout が指定されている場合にのみ、指定されたフィールド オフセットを受け入れられます。

既知の問題

  • リフレクション出力では、インターフェイスを実装する非抽象クラスが、インターフェイスで宣言されているすべてのメソッドを実装しているかどうかは確認されません。 ただし、クラスがインターフェイスで宣言されているすべてのメソッドを実装していない場合、ランタイムはクラスを読み込むことはありません。
  • TypeBuilderTypeから派生していますが、Type クラスで定義されている抽象メソッドの一部は、TypeBuilder クラスに完全には実装されていません。 これらの TypeBuilder メソッドの呼び出しでは NotSupportedException 例外がスローされます。 必要な機能を取得するには、 Type.GetType または Assembly.GetType を使用して作成された型を取得し、取得した型に反映します。