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.