Systému. Reflexe ion. Emit.TypeBuilder – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

TypeBuilder je kořenová třída používaná k řízení vytváření dynamických tříd v modulu runtime. Poskytuje sadu rutin, které se používají k definování tříd, přidání metod a polí a vytvoření třídy uvnitř modulu. Novou TypeBuilder lze vytvořit z dynamického modulu voláním ModuleBuilder.DefineType metody, která vrací TypeBuilder objekt.

generování Reflexe ion poskytuje následující možnosti pro definování typů:

  • Definujte třídu nebo rozhraní s daným názvem.
  • Definujte třídu nebo rozhraní s daným názvem a atributy.
  • Definujte třídu s daným názvem, atributy a základní třídou.
  • Definujte třídu s daným názvem, atributy, základní třídou a sadou rozhraní, která třída implementuje.
  • Definujte třídu s daným názvem, atributy, základní třídou a velikostí balení.
  • Definujte třídu s daným názvem, atributy, základní třídou a velikostí třídy jako celku.
  • Definujte třídu s daným názvem, atributy, základní třídou, velikostí balení a velikostí třídy jako celku.

Chcete-li vytvořit typ pole, typ ukazatele nebo typ byref pro neúplný typ, který je reprezentován objektemTypeBuilder, použijte metodu, MakePointerType metodu MakeArrayType nebo MakeByRefType metodu v uvedeném pořadí.

Než se použije typ, TypeBuilder.CreateType musí být volána metoda. CreateType dokončí vytvoření typu. Po volání CreateType může volající vytvořit instanci typu pomocí Activator.CreateInstance metody a vyvolat členy typu pomocí Type.InvokeMember metody. Jedná se o chybu vyvolání metod, které po volání CreateType změní implementaci typu. Modul CLR (Common Language Runtime) například vyvolá výjimku, pokud se volající pokusí přidat nové členy do typu.

Inicializátor třídy je vytvořen pomocí TypeBuilder.DefineTypeInitializer metody. DefineTypeInitializer vrátí ConstructorBuilder objekt.

Vnořené typy jsou definovány voláním jedné z TypeBuilder.DefineNestedType metod.

Atributy

Třída TypeBuilder pomocí výčtu TypeAttributes dále specifikuje vlastnosti typu, který se má vytvořit:

  • Rozhraní jsou určena pomocí TypeAttributes.Interface atributů.TypeAttributes.Abstract
  • Konkrétní třídy (třídy, které nelze rozšířit) jsou zadány pomocí atributu TypeAttributes.Sealed .
  • Viditelnost typu určuje několik atributů. Podívejte se na popis výčtu TypeAttributes .
  • Pokud TypeAttributes.SequentialLayout je zadán, zavaděč tříd vyloží pole v pořadí, v jakém se čtou z metadat. Zavaděč tříd považuje zadanou velikost balení, ale ignoruje všechny zadané posuny polí. Metadata zachová pořadí, ve kterém se vygenerují definice polí. I při sloučení nebudou metadata měnit pořadí definic polí. Zavaděč bude respektovat zadané posuny polí pouze v případě, že TypeAttributes.ExplicitLayout je zadán.

Známé problémy

  • Reflexe ion generování neověřuje, zda ne abstraktní třída, která implementuje rozhraní implementovala všechny metody deklarované v rozhraní. Pokud však třída neimplementuje všechny metody deklarované v rozhraní, modul runtime nenačte třídu.
  • Ačkoli TypeBuilder je odvozen z Type, některé z abstraktních metod definovaných Type ve třídě nejsou plně implementovány TypeBuilder ve třídě. Volání těchto TypeBuilder metod vyvolá NotSupportedException výjimku. Požadované funkce lze získat načtením vytvořeného typu pomocí Type.GetType načteného typu nebo Assembly.GetType reflektováním na načteného typu.