Condividi tramite


Classe System.Reflection.Emit.TypeBuilder

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

TypeBuilder è la classe radice usata per controllare la creazione di classi dinamiche nel runtime. Fornisce un set di routine usate per definire classi, aggiungere metodi e campi e creare la classe all'interno di un modulo. È possibile creare un nuovo TypeBuilder oggetto da un modulo dinamico chiamando il ModuleBuilder.DefineType metodo , che restituisce un TypeBuilder oggetto .

Reflection emit offre le opzioni seguenti per la definizione dei tipi:

  • Definire una classe o un'interfaccia con il nome specificato.
  • Definire una classe o un'interfaccia con il nome e gli attributi specificati.
  • Definire una classe con il nome, gli attributi e la classe base specificati.
  • Definire una classe con il nome, gli attributi, la classe di base e il set di interfacce implementate dalla classe.
  • Definire una classe con il nome, gli attributi, la classe di base e le dimensioni di compressione specificati.
  • Definire una classe con il nome, gli attributi, la classe base e le dimensioni della classe nel suo complesso.
  • Definire una classe con il nome, gli attributi, la classe base, le dimensioni di compressione e le dimensioni della classe nel suo complesso.

Per creare un tipo di matrice, un tipo di puntatore o un tipo byref per un tipo incompleto rappresentato da un TypeBuilder oggetto , utilizzare rispettivamente il metodo, MakePointerType il metodo o MakeByRefType il MakeArrayType metodo .

Prima di usare un tipo, è necessario chiamare il TypeBuilder.CreateType metodo . CreateType completa la creazione del tipo. Dopo la chiamata a CreateType, il chiamante può creare un'istanza del tipo usando il Activator.CreateInstance metodo e richiamare i membri del tipo usando il Type.InvokeMember metodo . Si tratta di un errore per richiamare i metodi che modificano l'implementazione di un tipo dopo la chiamata di CreateType . Ad esempio, Common Language Runtime genera un'eccezione se il chiamante tenta di aggiungere nuovi membri a un tipo.

Un inizializzatore di classe viene creato usando il TypeBuilder.DefineTypeInitializer metodo . DefineTypeInitializer restituisce un ConstructorBuilder oggetto .

I tipi annidati vengono definiti chiamando uno dei TypeBuilder.DefineNestedType metodi .

Attributi

La TypeBuilder classe usa l'enumerazione TypeAttributes per specificare ulteriormente le caratteristiche del tipo da creare:

  • Le interfacce vengono specificate usando gli TypeAttributes.Interface attributi e TypeAttributes.Abstract .
  • Le classi concrete (classi che non possono essere estese) vengono specificate usando l'attributo TypeAttributes.Sealed .
  • Diversi attributi determinano la visibilità del tipo. Vedere la descrizione dell'enumerazione TypeAttributes .
  • Se TypeAttributes.SequentialLayout viene specificato, il caricatore di classi dispone i campi nell'ordine in cui vengono letti dai metadati. Il caricatore di classi considera le dimensioni di compressione specificate, ma ignora eventuali offset di campo specificati. I metadati mantengono l'ordine in cui vengono generate le definizioni dei campi. Anche in un'unione, i metadati non riordinano le definizioni dei campi. Il caricatore rispetta gli offset di campo specificati solo se TypeAttributes.ExplicitLayout è specificato.

Problemi noti

  • Reflection emit non verifica se una classe non astratta che implementa un'interfaccia ha implementato tutti i metodi dichiarati nell'interfaccia. Tuttavia, se la classe non implementa tutti i metodi dichiarati in un'interfaccia, il runtime non carica la classe .
  • Sebbene TypeBuilder sia derivato da Type, alcuni dei metodi astratti definiti nella Type classe non sono completamente implementati nella TypeBuilder classe . Le chiamate a questi TypeBuilder metodi generano un'eccezione NotSupportedException . La funzionalità desiderata può essere ottenuta recuperando il tipo creato utilizzando Type.GetType o Assembly.GetType e riflettendo sul tipo recuperato.