本文提供了此 API 参考文档的补充说明。
该 MethodBuilder 类用于完全描述公共中间语言(CIL)中的方法,包括名称、属性、签名和方法正文。 它与 TypeBuilder 类结合使用,在运行时创建类。
可以使用反射发出功能定义全局方法,并将方法定义为类型成员。 定义方法的 API 返回 MethodBuilder 对象。
全局方法
通过使用ModuleBuilder.DefineGlobalMethod方法定义一个全局方法,该方法返回一个MethodBuilder
对象。
全局方法必须是静态的。 如果动态模块包含全局方法, ModuleBuilder.CreateGlobalFunctions 则必须在保留动态模块或包含动态程序集之前调用该方法,因为公共语言运行时会推迟修复动态模块,直到定义所有全局函数。
使用 ModuleBuilder.DefinePInvokeMethod 方法定义全局本机方法。 平台调用 (PInvoke) 方法不得声明为抽象或虚拟方法。 运行时设置 MethodAttributes.PinvokeImpl 平台调用方法的属性。
作为类型成员的方法
方法通过使用 TypeBuilder.DefineMethod 方法来定义为一个类型成员,并返回一个 MethodBuilder 对象。
该方法 DefineParameter 用于设置参数的名称和参数属性或返回值。 ParameterBuilder此方法返回的对象表示参数或返回值。 该 ParameterBuilder 对象可用于设置封送处理、设置常量值以及应用自定义属性。
特性
枚举 MethodAttributes 的成员定义了动态方法的精确特性:
- 静态方法是使用 MethodAttributes.Static 特性指定的。
- 最终方法(不能重写的方法)是使用 MethodAttributes.Final 特性指定的。
- 使用 MethodAttributes.Virtual 特性指定虚拟方法。
- 通过使用 MethodAttributes.Abstract 属性来指定抽象方法。
- 多个属性确定方法可见性。 请参见 MethodAttributes 枚举的说明。
- 实现重载运算符的方法必须设置 MethodAttributes.SpecialName 属性。
- 终结器必须设置 MethodAttributes.SpecialName 属性。
已知问题
- 虽然 MethodBuilder 派生自 MethodInfo,但 MethodInfo 类中定义的一些抽象方法并未在类中 MethodBuilder完全实现。 这些 MethodBuilder 方法将引发 NotSupportedException。 例如, MethodBuilder.Invoke 该方法未完全实现。 您可以通过使用 Type.GetType 或 Assembly.GetType 方法检索封闭类型来反思这些方法。
- 支持自定义修饰符。