Clase System.Reflection.Emit.TypeBuilder

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

TypeBuilder es la clase raíz que se usa para controlar la creación de clases dinámicas en el tiempo de ejecución. Proporciona un conjunto de rutinas que se usan para definir clases, agregar métodos y campos y crear la clase dentro de un módulo. Se puede crear un nuevo TypeBuilder a partir de un módulo dinámico llamando al ModuleBuilder.DefineType método , que devuelve un TypeBuilder objeto .

Reflexiones emisión proporciona las siguientes opciones para definir tipos:

  • Defina una clase o interfaz con el nombre especificado.
  • Defina una clase o interfaz con el nombre y los atributos especificados.
  • Defina una clase con el nombre, los atributos y la clase base especificados.
  • Defina una clase con el nombre, los atributos, la clase base y el conjunto de interfaces que implementa la clase.
  • Defina una clase con el nombre, los atributos, la clase base y el tamaño de empaquetado especificados.
  • Defina una clase con el nombre, los atributos, la clase base y el tamaño de clase como un todo.
  • Defina una clase con el nombre, los atributos, la clase base, el tamaño de empaquetado y el tamaño de clase como un todo.

Para crear un tipo de matriz, un tipo de puntero o un tipo byref para un tipo incompleto representado por un TypeBuilder objeto, use el método, MakePointerType el MakeArrayType método o MakeByRefType el método, respectivamente.

Antes de usar un tipo, se debe llamar al TypeBuilder.CreateType método . CreateType completa la creación del tipo. Después de la llamada a CreateType, el autor de la llamada puede crear instancias del tipo mediante el Activator.CreateInstance método e invocar miembros del tipo mediante el Type.InvokeMember método . Es un error invocar métodos que cambian la implementación de un tipo después de llamar a CreateType . Por ejemplo, Common Language Runtime produce una excepción si el autor de la llamada intenta agregar nuevos miembros a un tipo.

Se crea un inicializador de clase mediante el TypeBuilder.DefineTypeInitializer método . DefineTypeInitializer devuelve un ConstructorBuilder objeto .

Los tipos anidados se definen llamando a uno de los TypeBuilder.DefineNestedType métodos.

Atributos

La TypeBuilder clase usa la TypeAttributes enumeración para especificar aún más las características del tipo que se va a crear:

  • Las interfaces se especifican mediante los TypeAttributes.Interface atributos y TypeAttributes.Abstract .
  • Las clases concretas (clases que no se pueden extender) se especifican mediante el TypeAttributes.Sealed atributo .
  • Varios atributos determinan la visibilidad del tipo. Consulte la descripción de la TypeAttributes enumeración.
  • Si TypeAttributes.SequentialLayout se especifica, el cargador de clases establece los campos en el orden en que se leen de los metadatos. El cargador de clases considera el tamaño de empaquetado especificado, pero omite los desplazamientos de campo especificados. Los metadatos conservan el orden en que se emiten las definiciones de campo. Incluso en una combinación, los metadatos no reordenarán las definiciones de campo. El cargador respetará los desplazamientos de campo especificados solo si TypeAttributes.ExplicitLayout se especifica.

Problemas conocidos

  • Reflexiones emisión no comprueba si una clase no abstracta que implementa una interfaz ha implementado todos los métodos declarados en la interfaz. Sin embargo, si la clase no implementa todos los métodos declarados en una interfaz, el tiempo de ejecución no carga la clase .
  • Aunque TypeBuilder se deriva de Type, algunos de los métodos abstractos definidos en la Type clase no se implementan completamente en la TypeBuilder clase . Las llamadas a estos TypeBuilder métodos producen una NotSupportedException excepción. La funcionalidad deseada se puede obtener recuperando el tipo creado mediante o Type.GetTypeAssembly.GetType y reflejando en el tipo recuperado.