1. 程式人生 > >第十八章 定制特性

第十八章 定制特性

返回值 8.4 數據類型 數據 支持 狀態 work defined 返回

目錄:

18.1 使用定制特性

18.2 定義自己的特性類

18.3 特性構造器和字段/屬性數據類型

18.4 檢測定制特性

18.5 兩個特性實例的相互匹配

18.6 檢測定制特性時不創建從Attribute派生的對象

18.7 條件特性類

定制特性:利用定制特性,可宣告式地為自己的代碼構造添加註解來實現特殊功能。定制特性允許為幾乎每一個元數據表記錄項定義和應用信息。這種可擴展的元數據信息能在運行時查詢,從而動態改變代碼的執行方法。

18.1 使用定制特性

自定義特性將一些附加信息與某個目標元素關聯起來。編譯器在托管模塊的元數據中生成(嵌入)這些額外的信息。

定制特性其實是一個類型的實例。為了符合CLS的要求,定制特性類必須直接或間接從公共抽象類System.Attribut派生。

特性時類的實例,類必須有公共構造器才能創建它的實例。所以,將特性應用於目標元素時,語法類型於調用類的某個實例構造器。除此之外,語言可能支持一些特殊的語法,允許設置與特性類關聯的公共字段或屬性。

構造器參數稱為定位參數,而且時強制性的;也就是說,應用特性時必須指定參數。用於設置字段或屬性的“參數”稱為“命名參數

18.2 定義自己的特性類

AttributeUsage特性:

公共構造器:它允許傳遞位標誌來指明特性的合法應用範圍。

AllowMultiple屬性:設置為true,特性就只能向選定的目標元素應用一次。(可選)

Inherited屬性:它指出特性在應用於基類時,是否同時應用於派生類和重寫的方法。true為應用(可選)註意:.NET Framework只認為類,方法,屬性,事件,字段,方法返回值和參數等目標元素時可繼承的。所以,定義特性類型時,只有在該特性應用於上述某個目標的前提下,才可以將Inherited設為true。

18.3 特性構造器和字段/屬性數據類型

應用特性時必須傳遞一個編譯時常量表達式,它與特性類定義的類型匹配。

編譯器采用增強型構造器語法所指定的值,對任何公共字段和屬性進行初始化。構造並初始化好定制特性類的對象之後,編譯器將它的狀態序列化到目標元素的元素據表記錄項中。

18.4 檢測定制特性

可利用反射的技術檢測特性是否存在。

IsDefined:如果至少有一個指定的Attribute派生類的實例與目標關聯,就返回true。這個方法效率很高,因為它不夠造(反序列化)特性類的任何實例。

GetCustomAttributes:返回應用於目標的指定特性對象的集合。每個實例都使用編譯時指定的參數,字段和屬性來構造(反序列化)。如果目標沒有應用指定等特性類的實例,就返回一個空集合。該方法通常用於已將AllowMultiple設為true的特性,或者用於列出已應用的所有特性。

GetCustomAttribute;返回應用於目標的指定特性類的實例。實例使用編譯時指定的參數,字段和屬性來構造(反序列化)。如果目標沒有應用特性類的實例,就返回null。若果目標應用了指定特性的多個實例,就拋出異常。該方法通常用於已將AllowMultiple設為false的特性。

調用上述人的方法,內部都必須掃描托管模塊的元數據,執行字符串比較來定位指定的定制特性類。

18.5 兩個特性實例的相互匹配

18.6 檢測定制特性時不創建從Attribute派生的對象

18.7 條件特性類

第十八章 定制特性