System.Reflection.Emit.TypeBuilder-klasse
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
TypeBuilder is de hoofdklasse die wordt gebruikt om het maken van dynamische klassen in de runtime te beheren. Het biedt een reeks routines die worden gebruikt om klassen te definiëren, methoden en velden toe te voegen en de klasse in een module te maken. Er kan een nieuwe TypeBuilder worden gemaakt op basis van een dynamische module door de ModuleBuilder.DefineType methode aan te roepen, die een TypeBuilder object retourneert.
Reflectie-emit biedt de volgende opties voor het definiëren van typen:
- Definieer een klasse of interface met de opgegeven naam.
- Definieer een klasse of interface met de opgegeven naam en kenmerken.
- Definieer een klasse met de opgegeven naam, kenmerken en basisklasse.
- Definieer een klasse met de opgegeven naam, kenmerken, basisklasse en de set interfaces die door de klasse worden geïmplementeerd.
- Definieer een klasse met de opgegeven naam, kenmerken, basisklasse en verpakkingsgrootte.
- Definieer een klasse met de opgegeven naam, kenmerken, basisklasse en de klassegrootte als geheel.
- Definieer een klasse met de opgegeven naam, kenmerken, basisklasse, verpakkingsgrootte en de klassegrootte als geheel.
Als u een matrixtype, aanwijzer of byref-type wilt maken voor een onvolledig type dat wordt vertegenwoordigd door een TypeBuilder object, gebruikt u respectievelijk de MakeArrayType methode, MakePointerType methode of MakeByRefType methode.
Voordat een type wordt gebruikt, moet de TypeBuilder.CreateType methode worden aangeroepen. CreateType voltooit het maken van het type. Na de aanroep van CreateType kan de beller het type instantiëren met behulp van de Activator.CreateInstance methode en leden van het type aanroepen met behulp van de Type.InvokeMember methode. Het is een fout bij het aanroepen van methoden die de implementatie van een type wijzigen nadat CreateType is aangeroepen. De algemene taalruntime genereert bijvoorbeeld een uitzondering als de aanroeper nieuwe leden probeert toe te voegen aan een type.
Er wordt een klasse-initializer gemaakt met behulp van de TypeBuilder.DefineTypeInitializer methode. DefineTypeInitializer retourneert een ConstructorBuilder object.
Geneste typen worden gedefinieerd door een van de TypeBuilder.DefineNestedType methoden aan te roepen.
Kenmerken
De TypeBuilder klasse gebruikt de TypeAttributes opsomming om de kenmerken van het type dat moet worden gemaakt verder op te geven:
- Interfaces worden opgegeven met behulp van de TypeAttributes.Interface en TypeAttributes.Abstract kenmerken.
- Concrete klassen (klassen die niet kunnen worden uitgebreid) worden opgegeven met behulp van het TypeAttributes.Sealed kenmerk.
- Verschillende kenmerken bepalen de zichtbaarheid van het type. Zie de beschrijving van de TypeAttributes opsomming.
- Als TypeAttributes.SequentialLayout dit is opgegeven, legt het klasselaadprogramma velden in de volgorde waarin ze worden gelezen uit metagegevens. De klasselader beschouwt de opgegeven verpakkingsgrootte, maar negeert eventuele opgegeven veldverschuivingen. De metagegevens behouden de volgorde waarin de velddefinities worden verzonden. Zelfs bij een samenvoegbewerking worden de velddefinities niet opnieuw gerangschikt in de metagegevens. Het laadprogramma zal de opgegeven veldverschuivingen alleen respecteren als TypeAttributes.ExplicitLayout deze is opgegeven.
Bekende problemen
- Reflectie-emit controleert niet of een niet-abstracte klasse die een interface implementeert, alle methoden heeft geïmplementeerd die in de interface zijn gedeclareerd. Als de klasse echter niet alle methoden implementeert die in een interface zijn gedeclareerd, laadt de runtime de klasse niet.
- Hoewel TypeBuilder deze is afgeleid van Type, worden sommige abstracte methoden die in de Type klasse zijn gedefinieerd, niet volledig geïmplementeerd in de TypeBuilder klasse. Aanroepen naar deze TypeBuilder methoden genereren een NotSupportedException uitzondering. De gewenste functionaliteit kan worden verkregen door het gemaakte type op te halen met behulp van de Type.GetType of Assembly.GetType en reflectie op het opgehaalde type.