使用反映發出定義方法
更新:2007 年 11 月
本章節說明如何使用反映發出來定義全域方法,並定義方法為型別成員。定義方法的 API 會傳回 MethodBuilder 物件。
MethodBuilder.AddDeclarativeSecurity 方法會加入宣告式安全性至正在建置的方法。您可以呼叫 AddDeclarativeSecurity 數次,而每次呼叫都會指定安全性動作 (例如 Demand、Assert、Deny) 和適用該動作的使用權限集合。
全域方法使用 ModuleBuilder.DefineGlobalMethod 方法來定義。DefineGlobalMethod 傳回 MethodBuilder。
全域方法必須為靜態。如果動態模組包含全域方法,在保存動態模組或動態包含組件之前必須呼叫 ModuleBuilder.CreateGlobalFunctions 方法,因為 Common Language Runtime 會延後修復動態模組,直到所有全域函式都已定義為止。
全域原生方法使用 ModuleBuilder.DefinePInvokeMethod 方法來定義。平台叫用 (PInvoke) 方法不可以宣告為抽象或虛擬。執行階段會為平台叫用方法設定 MethodAttributes.PInvokeImpl 屬性 (Attribute)。
方法是使用 TypeBuilder.DefineMethod 方法定義為型別成員。DefineMethod 傳回 MethodBuilder。
DefineParameter 方法是用來設定參數或傳回值的名稱和參數屬性。這個方法傳回的 ParameterBuilder 物件代表參數或傳回值;ParameterBuilder 物件可用於設定封送處理 (Marshaling)、設定常數值,以及用於套用自訂的屬性。
注意事項: |
---|
在 .NET Framework 1.0 和 1.1 版中,DefineParameter 方法無法在傳回值上使用。 |
屬性
靜態方法使用 MethodAttributes.Static 屬性來指定。
Final 方法 (不能被覆寫的方法) 使用 MethodAttributes.Final 屬性來指定。
虛擬方法使用 MethodAttributes.Virtual 屬性來指定。
抽象方法使用 MethodAttributes.Abstract 屬性來指定。
有數個屬性可決定方法的可視性。請參閱 MethodAttributes 列舉型別的描述。
實作多載運算子的方法必須設定 MethodAttributes.SpecialName 屬性。
完成項必須設定 MethodAttributes.SpecialName 屬性。
已知的問題
雖然 MethodBuilder 衍生自 MethodInfo,一些在 MethodInfo 類別中定義的抽象方法在 MethodBuilder 中並未被完整實作。這些 MethodBuilder 方法會擲回 NotSupportedException。例如 MethodBuilder.Invoke 方法並未被完整實作。您可以藉著使用 Type.GetType 或 Assembly.GetType 來擷取封入型別 (Enclosing Type),以反映這些方法。
.NET Framework 2.0 版支援自訂修飾詞 (Modifier),舊版中則不支援。