共用方式為


使用反映發出定義型別

型別使用 ModuleBuilder.DefineType 方法,被定義於動態模組的範圍中 (Scope)。DefineType 傳回 TypeBuilder。在這個主題中,型別名稱一定是包括命名空間的完整路徑名稱。例如,如果型別名稱為 Aaa.Bbb.Ccc,Aaa.Bbb 即被認定是命名空間。

反映發出提供下列選項來定義型別:

  • 以指定名稱來定義類別或介面。

  • 以指定名稱和屬性 (Attribute) 來定義類別或介面。

  • 以指定名稱、屬性和基底類別來定義類別。

  • 以指定名稱、屬性、基底類別和類別實作的介面集合來定義類別。

  • 以指定名稱、屬性、基底類別和封裝大小來定義類別。

  • 以指定名稱、屬性、基底類別和類別大小為整體來定義類別。

  • 以指定名稱、屬性、基底類別、封裝大小和類別大小為整體來定義類別。

在使用型別之前,必須呼叫 TypeBuilder.CreateType 方法。CreateType 完成型別的建立。呼叫 CreateType 之後,呼叫端可以執行個體化型別 (使用 Activator.CreateInstance 方法) 和叫用型別的成員 (使用 Type.InvokeMember 方法)。已經呼叫 CreateType 之後再來叫用會變更型別實作的方法,是錯誤的。例如,如果呼叫端嘗試加入新成員至型別的話,Common Language Runtime 會擲回例外狀況 (Exception)。

使用 TypeBuilder.DefineTypeInitializer 方法來建立類別初始設定式。DefineTypeInitializer 傳回 ConstructorBuilder

巢狀型別使用 TypeBuilder.DefineNestedType 方法的其中之一來定義。

TypeBuilder.AddDeclarativeSecurity 方法會加入宣告式安全性至正在建置 (Build) 的型別。您可以呼叫 AddDeclarativeSecurity 數次,而每次呼叫都會指定安全性動作 (例如 DemandAssertDeny) 和適用該動作的使用權限集合。

屬性

  • 介面使用 TypeAttributes.InterfaceTypeAttributes.Abstract 屬性來指定。

  • 使用 TypeAttributes.Sealed 屬性來指定具體類別 (不能擴充的類別)。

  • 有數個屬性可以決定型別可視性。請參閱 TypeAttributes 列舉型別的說明。

  • 如果 TypeAttributes.LayoutSequential 已指定,類別載入器會配置欄位,以便從中繼資料中讀取它們。類別載入器會考慮指定的封裝大小,但忽略任何指定的欄位位移 (Offset)。中繼資料保留發出欄位定義的順序。即使橫向合併,中繼資料都不會重新排列欄位定義。載入器將認可指定的欄位位移,只要 TypeAttributes.ExplicitLayout 被指定。

已知的問題

  • 反映發出不會驗證實作介面的非抽象類別,是否已經實作介面中宣告的所有方法。然而,如果類別不實作介面中宣告的所有方法,執行階段即不會載入類別。

  • 雖然 TypeBuilder 衍生自 Type,一些定義於 Type 類別中的抽象方法並不會在 TypeBuilder 中完整實作。這些 TypeBuilder 方法會擲回 NotSupportedException。藉著使用 Type.GetTypeAssembly.GetType 來擷取建立的型別,並反映擷取的型別,即可獲得所想要的功能。

請參閱

其他資源

使用反映發出