System.Reflection.Emit.TypeBuilder 类
本文提供了此 API 参考文档的补充说明。
TypeBuilder 是用于控制在运行时中创建动态类的根类。 它提供一组例程,用于定义类、添加方法和字段,并在模块中创建类。 可以通过调用ModuleBuilder.DefineType返回对象的方法,从动态模块创建一个新TypeBuilderTypeBuilder项。
反应ion 发出提供以下用于定义类型的选项:
- 定义具有给定名称的类或接口。
- 使用给定名称和属性定义类或接口。
- 使用给定的名称、属性和基类定义类。
- 使用给定的名称、属性、基类和类实现的接口集定义类。
- 使用给定的名称、属性、基类和包装大小定义类。
- 定义具有给定名称、属性、基类和整体类大小的类。
- 定义具有给定名称、属性、基类、打包大小和整体类大小的类。
若要为对象表示 TypeBuilder 的不完整类型创建数组类型、指针类型或 byref 类型,请分别使用 MakeArrayType 方法、 MakePointerType 方法或 MakeByRefType 方法。
在使用类型之前, TypeBuilder.CreateType 必须调用该方法。 CreateType 完成类型的创建。 调用 CreateType 后,调用方可以使用该方法实例化类型 Activator.CreateInstance ,并使用 Type.InvokeMember 该方法调用该类型的成员。 调用在调用 CreateType 后更改类型实现的方法是错误的。 例如,如果调用方尝试向类型添加新成员,则公共语言运行时将引发异常。
类初始值设定项是使用 TypeBuilder.DefineTypeInitializer 该方法创建的。 DefineTypeInitializer 返回一个 ConstructorBuilder 对象。
通过调用其中 TypeBuilder.DefineNestedType 一种方法来定义嵌套类型。
属性
该 TypeBuilder 类使用 TypeAttributes 枚举进一步指定要创建的类型的特征:
- 接口是使用 TypeAttributes.Interface 属性 TypeAttributes.Abstract 指定的。
- 具体类(不能扩展的类)是使用 TypeAttributes.Sealed 特性指定的。
- 多个属性确定类型可见性。 请参阅枚举的说明 TypeAttributes 。
- 如果 TypeAttributes.SequentialLayout 指定了字段,则类加载程序按从元数据中读取的顺序布局字段。 类加载程序将考虑指定的打包大小,但忽略任何指定的字段偏移量。 元数据保留发出字段定义的顺序。 即使在合并中,元数据也不会对字段定义重新排序。 仅当指定时 TypeAttributes.ExplicitLayout ,加载程序才会遵循指定的字段偏移量。
已知问题
- 反应ion 发出不验证实现接口的非抽象类是否已实现接口中声明的所有方法。 但是,如果类未实现接口中声明的所有方法,则运行时不会加载该类。
- 虽然 TypeBuilder 派生自 Type,但 Type 类中定义的一些抽象方法未在类中 TypeBuilder 完全实现。 对这些 TypeBuilder 方法的调用将引发异常 NotSupportedException 。 可以通过使用 Type.GetType 或 Assembly.GetType 反映检索的类型来获取所需的功能。