System. Emocje ion. Emit.TypeBuilder, klasa

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

TypeBuilder jest klasą główną używaną do kontrolowania tworzenia klas dynamicznych w środowisku uruchomieniowym. Udostępnia zestaw procedur używanych do definiowania klas, dodawania metod i pól oraz tworzenia klasy wewnątrz modułu. Nowy TypeBuilder można utworzyć na podstawie modułu dynamicznego, wywołując metodę ModuleBuilder.DefineTypeTypeBuilder , która zwraca obiekt.

Emisja Emocje ion udostępnia następujące opcje definiowania typów:

  • Zdefiniuj klasę lub interfejs o podanej nazwie.
  • Zdefiniuj klasę lub interfejs z daną nazwą i atrybutami.
  • Zdefiniuj klasę o podanej nazwie, atrybutach i klasie bazowej.
  • Zdefiniuj klasę o podanej nazwie, atrybutach, klasie bazowej i zestawie interfejsów implementujących klasę.
  • Zdefiniuj klasę o podanej nazwie, atrybutach, klasie bazowej i rozmiarze pakowania.
  • Zdefiniuj klasę o podanej nazwie, atrybutach, klasie bazowej i rozmiarze klasy jako całości.
  • Zdefiniuj klasę o podanej nazwie, atrybutach, klasie bazowej, rozmiarze pakowania i rozmiarze klasy jako całości.

Aby utworzyć typ tablicy, typ wskaźnika lub typ byref dla niekompletnego typu reprezentowanego przez TypeBuilder obiekt, użyj MakeArrayType odpowiednio metody, MakePointerType metody lub MakeByRefType metody.

Przed zastosowaniem typu należy wywołać metodę TypeBuilder.CreateType . Metoda CreateType kończy tworzenie typu. Po wywołaniu metody CreateType obiekt wywołujący może utworzyć wystąpienie typu przy użyciu Activator.CreateInstance metody i wywołać elementy członkowskie typu przy użyciu Type.InvokeMember metody . Jest to błąd podczas wywoływania metod, które zmieniają implementację typu po wywołaniu metody CreateType . Na przykład środowisko uruchomieniowe języka wspólnego zgłasza wyjątek, jeśli obiekt wywołujący próbuje dodać nowe elementy członkowskie do typu.

Inicjator klasy jest tworzony przy użyciu TypeBuilder.DefineTypeInitializer metody . Funkcja DefineTypeInitializer zwraca ConstructorBuilder obiekt.

Typy zagnieżdżone są definiowane przez wywołanie jednej z TypeBuilder.DefineNestedType metod.

Atrybuty

Klasa TypeBuilder używa TypeAttributes wyliczenia, aby dodatkowo określić charakterystykę typu, który ma zostać utworzony:

  • Interfejsy są określane przy użyciu TypeAttributes.Interface atrybutów i TypeAttributes.Abstract .
  • Klasy betonowe (których nie można rozszerzyć) są określane przy użyciu atrybutu TypeAttributes.Sealed .
  • Kilka atrybutów określa widoczność typu. Zobacz opis TypeAttributes wyliczenia.
  • Jeśli TypeAttributes.SequentialLayout zostanie określony, moduł ładujący klasy określa pola w kolejności odczytywania z metadanych. Moduł ładujący klasy uwzględnia określony rozmiar pakowania, ale ignoruje wszelkie przesunięcia określonego pola. Metadane zachowują kolejność, w jakiej są emitowane definicje pól. Nawet w przypadku scalania metadane nie zmienią kolejności definicji pól. Moduł ładujący będzie honorować określone przesunięcia pól tylko wtedy, gdy TypeAttributes.ExplicitLayout jest określony.

Znane problemy

  • Emocje emitowanie nie sprawdza, czy klasa nie abstrakcyjna, która implementuje interfejs, zaimplementowała wszystkie metody zadeklarowane w interfejsie. Jeśli jednak klasa nie implementuje wszystkich metod zadeklarowanych w interfejsie, środowisko uruchomieniowe nie ładuje klasy.
  • Chociaż TypeBuilder pochodzi z Typeklasy , niektóre metody abstrakcyjne zdefiniowane w Type klasie nie są w pełni implementowane w TypeBuilder klasie. Wywołania tych TypeBuilder metod zgłaszają NotSupportedException wyjątek. Żądaną funkcjonalność można uzyskać, pobierając utworzony typ przy użyciu Type.GetType elementu lub Assembly.GetType i zastanawiając się nad pobranym typem.