Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anmärkning
Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.
TypeBuilder är den rotklass som används för att styra skapandet av dynamiska klasser i körningen. Den innehåller en uppsättning rutiner som används för att definiera klasser, lägga till metoder och fält och skapa klassen i en modul. En ny TypeBuilder kan skapas från en dynamisk modul genom att anropa ModuleBuilder.DefineType metoden, som returnerar ett TypeBuilder objekt.
Reflection emit ger följande alternativ för att definiera typer:
- Definiera en klass eller ett gränssnitt med det angivna namnet.
- Definiera en klass eller ett gränssnitt med det angivna namnet och attributen.
- Definiera en klass med förnamn, attribut och basklass.
- Definiera en klass med det angivna namnet, attributen, basklassen och den uppsättning gränssnitt som klassen implementerar.
- Definiera en klass med förnamn, attribut, basklass och förpackningsstorlek.
- Definiera en klass med förnamnet, attributen, basklassen och klassstorleken som helhet.
- Definiera en klass med förnamnet, attributen, basklassen, förpackningsstorleken och klassstorleken som helhet.
Om du vill skapa en matristyp, pekartyp eller byref-typ för en ofullständig typ som representeras av ett TypeBuilder objekt använder du MakeArrayType metoden, MakePointerType metoden eller MakeByRefType metoden.
Innan en typ används TypeBuilder.CreateType måste metoden anropas. CreateType slutför skapandet av typen. Efter anropet till CreateType kan anroparen instansiera typen med hjälp Activator.CreateInstance av metoden och anropa medlemmar av typen med hjälp Type.InvokeMember av metoden. Det är ett fel att anropa metoder som ändrar implementeringen av en typ när CreateType har anropats. Till exempel genererar den vanliga språkkörningen ett undantag om anroparen försöker lägga till nya medlemmar i en typ.
En klassinitierare skapas med hjälp av TypeBuilder.DefineTypeInitializer metoden. DefineTypeInitializer returnerar ett ConstructorBuilder objekt.
Kapslade typer definieras genom att anropa någon av TypeBuilder.DefineNestedType metoderna.
Egenskaper
Klassen TypeBuilder använder TypeAttributes uppräkningen för att ytterligare ange egenskaperna för den typ som ska skapas:
- Gränssnitt anges med hjälp av attributen TypeAttributes.Interface och TypeAttributes.Abstract .
- Konkreta klasser (klasser som inte kan utökas) anges med hjälp av attributet TypeAttributes.Sealed .
- Flera attribut avgör typens synlighet. Se beskrivningen av TypeAttributes uppräkningen.
- Om TypeAttributes.SequentialLayout anges lägger klassinläsaren ut fält i den ordning de läses från metadata. Klassinläsaren tar hänsyn till den angivna förpackningsstorleken men ignorerar eventuella angivna fältförskjutningar. Metadata bevarar den ordning i vilken fältdefinitionerna genereras. Även i en sammanslagning kommer metadata inte att ändra ordning på fältdefinitionerna. Inläsaren kommer bara att uppfylla de angivna fältförskjutningarna om TypeAttributes.ExplicitLayout anges.
Kända problemområden
- Reflection emit kontrollerar inte om en icke-abstrakt klass som implementerar ett gränssnitt har implementerat alla metoder som deklarerats i gränssnittet. Men om klassen inte implementerar alla metoder som deklarerats i ett gränssnitt, laddas inte klassen in vid körning.
- Även om TypeBuilder härleds från Typeimplementeras inte några av de abstrakta metoder som definierats i Type klassen fullständigt i TypeBuilder klassen. Anrop till dessa TypeBuilder metoder utlöser ett NotSupportedException undantag. Du kan hämta önskade funktioner genom att hämta den skapade typen med hjälp av Type.GetType eller Assembly.GetType och reflektera över den hämtade typen.