Megosztás a következőn keresztül:


Rendszer. Önkifejezés ion. Emit.TypeBuilder osztály

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

TypeBuilder a futtatókörnyezetben a dinamikus osztályok létrehozásának szabályozására használt gyökérosztály. Olyan rutinokat biztosít, amelyek osztályokat definiálnak, metódusokat és mezőket adnak hozzá, és egy modulon belül hozzák létre az osztályt. Egy új TypeBuilder dinamikus modulból létrehozható a ModuleBuilder.DefineType metódus meghívásával, amely egy objektumot TypeBuilder ad vissza.

Önkifejezés ion-bocsát ki a következő lehetőségeket adja meg a típusok meghatározásához:

  • Adjon meg egy osztályt vagy felületet a megadott névvel.
  • Adjon meg egy osztályt vagy felületet a megadott névvel és attribútumokkal.
  • Adjon meg egy adott nevet, attribútumokat és alaposztályt tartalmazó osztályt.
  • Definiáljon egy osztályt a megadott névvel, attribútumokkal, alaposztálysal és az osztály által implementálható interfészkészlettel.
  • Adjon meg egy osztályt a megadott névvel, attribútumokkal, alaposztálysal és csomagolási mérettel.
  • Definiáljon egy osztályt a megadott névvel, attribútumokkal, alaposztálysal és az osztály méretével egészben.
  • Definiáljon egy osztályt a megadott névvel, attribútumokkal, alaposztálysal, csomagolási mérettel és az osztály egészével.

Ha egy objektum által képviselt hiányos típushoz tömbtípust, mutatótípust vagy byref típust TypeBuilder szeretne létrehozni, használja a metódust, MakePointerType a metódust vagy MakeByRefType a MakeArrayType metódust.

A típus használata előtt meg kell hívni a metódust TypeBuilder.CreateType . A CreateType befejezi a típus létrehozását. A CreateType hívását követően a hívó a metódus használatával példányosíthatja a Activator.CreateInstance típust, és meghívhatja a típus tagjait a Type.InvokeMember metódus használatával. Hiba olyan metódusokat meghívni, amelyek megváltoztatják egy típus implementációját a CreateType meghívása után. A közös nyelvi futtatókörnyezet például kivételt jelez, ha a hívó új tagokat próbál hozzáadni egy típushoz.

A metódus használatával létrejön egy TypeBuilder.DefineTypeInitializer osztály inicializálója. A DefineTypeInitializer egy objektumot ConstructorBuilder ad vissza.

A beágyazott típusok az egyik TypeBuilder.DefineNestedType metódus meghívásával vannak definiálva.

Attribútumok

Az TypeBuilder osztály az enumerálást használja a TypeAttributes létrehozandó típus jellemzőinek további meghatározására:

  • Az interfészek az és TypeAttributes.Abstract az TypeAttributes.Interface attribútumok használatával vannak megadva.
  • A konkrét osztályok (nem bővíthető osztályok) az TypeAttributes.Sealed attribútum használatával vannak megadva.
  • Számos attribútum határozza meg a típus láthatóságát. Tekintse meg az enumerálás leírását TypeAttributes .
  • Ha TypeAttributes.SequentialLayout meg van adva, az osztálybetöltő a metaadatokból beolvasott mezők sorrendjét határozza meg. Az osztálybetöltő figyelembe veszi a megadott csomagolási méretet, de figyelmen kívül hagyja a megadott mezőeltolódásokat. A metaadatok megőrzik a meződefiníciók kibocsátásának sorrendjét. A metaadatok még az egyesítés során sem rendezik újra a meződefiníciókat. A betöltő csak akkor tartja tiszteletben a megadott mezőeltolásokat, ha TypeAttributes.ExplicitLayout meg van adva.

Ismert problémák

  • Önkifejezés ion-kibocsátás nem ellenőrzi, hogy az interfészt implementáló nem absztrakt osztály implementálta-e az interfészben deklarált összes metódust. Ha azonban az osztály nem implementálja a felületen deklarált összes metódust, a futtatókörnyezet nem tölti be az osztályt.
  • Bár TypeBuilder az osztályból Typeszármazik, az osztályban Type definiált absztrakt metódusok némelyike nem teljes mértékben implementálva van az TypeBuilder osztályban. Az ezekre TypeBuilder a metódusokra irányuló hívások kivételt képeznek NotSupportedException . A kívánt funkció a létrehozott típus lekérésével, illetve Assembly.GetType a Type.GetType lekért típuson való tükrözéssel érhető el.