用反射发出定义方法
更新:2007 年 11 月
本节描述如何使用反射发出定义全局方法和将方法定义为类型成员。定义方法的 API 返回 MethodBuilder 对象。
MethodBuilder.AddDeclarativeSecurity 方法将声明性安全添加到所生成的方法。可以多次调用 AddDeclarativeSecurity,每次调用指定一个安全操作(如 Demand、Assert 和 Deny)和该操作应用于的权限集。
使用 ModuleBuilder.DefineGlobalMethod 方法定义全局方法。DefineGlobalMethod 返回 MethodBuilder。
全局方法必须是静态的。如果动态模块包含全局方法,则在保持动态模块或包含动态程序集之前,必须调用 ModuleBuilder.CreateGlobalFunctions 方法,这是因为公共语言运行库一直推迟到已定义所有全局函数后才修复动态模块。
使用 ModuleBuilder.DefinePInvokeMethod 方法定义全局本机方法。不能将平台调用 (PInvoke) 方法声明为抽象的或虚拟的。运行库设置平台调用方法的 MethodAttributes.PInvokeImpl 属性。
使用 TypeBuilder.DefineMethod 方法将方法定义为类型成员。DefineMethod 返回 MethodBuilder。
DefineParameter 方法用于设置参数或返回值的名称与参数属性。由此方法返回的 ParameterBuilder 对象表示参数或返回值。ParameterBuilder 对象可用于设置封送处理、设置常量值、应用自定义属性。
说明: |
---|
在 .NET Framework 1.0 和 1.1 版本中,无法对返回值使用 DefineParameter 方法。 |
属性
使用 MethodAttributes.Static 属性指定静态方法。
使用 MethodAttributes.Final 属性指定 Final 方法(无法重写的方法)。
使用 MethodAttributes.Virtual 属性指定虚方法。
使用 MethodAttributes.Abstract 属性指定抽象方法。
若干属性确定方法可见性。请参见 MethodAttributes 枚举的说明。
实现重载运算符的方法必须设置 MethodAttributes.SpecialName 属性。
终结程序必须设置 MethodAttributes.SpecialName 属性。
已知问题
虽然 MethodBuilder 从 MethodInfo 派生,但 MethodInfo 类中定义的某些抽象方法在 MethodBuilder 中没有完全实现。这些 MethodBuilder 方法引发 NotSupportedException。例如,MethodBuilder.Invoke 方法没有完全实现。通过使用 Type.GetType 或 Assembly.GetType 检索封闭类型,可以在这些方法上反射。
.NET Framework 2.0 版本支持自定义修饰符。早期版本不支持自定义修饰符。