システム。リフレクトion。Emit.TypeBuilder クラス

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

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

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

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

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

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

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

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

属性

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

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

既知の問題

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