System.Reflection.Emit.MethodBuilder 类
本文提供了此 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 方法检索封闭类型来反映这些方法。
- 支持自定义修饰符。