本文主要復習下基礎知識:
1.C#系統自帶的特性:
建立一個控制台項目取名為AttributeTest:
我們添加了一個系統自帶的Attribute叫Condition,這個特性表示在程序的DEBUG狀態下才可以運行方法,我們在DEBUG下運行可以正常輸出:
然后我們改為Release模式不會看到結果:
我們也可以寫一個預處理指令在Release模式下也可以實現DEBUG的效果:
下面再來試下第二個系統自帶的特性Obsolete,用來標識方法還能不能用的特性,如果當一個方法加了Obsolete特性且指定了錯誤信息的顯示那么在調試生成的時候就不能通過編譯:
2.自定義Attribute
3.通過反射來獲取到2自定義的特性里面的信息:


最后總結一下特性的調用原理其實就是對特性類的一個實例化:
Attribute 實例化的語法是相當怪異的,主要體現在以下三點:
1. 不使用new 操作符來產生實例,而是使用在方括號里調用構造函數來產生實例。
2. 方括號必需緊挨着放置在被附着目標的前面。
3. 因為方括號里空間有限,不能像使用new 那樣先構造對象,然后再給對象的屬性(Property)賦值。 因此,對Attribute 實例的屬性賦值也在構造函數的圓括號里。
並且,Attribute 實例化時尤其要注意的是:
1. 構造函數的參數是一定要寫。有幾個就得寫幾個,因為你不寫的話實例就無法構造出來。
2. 構造函數參數的順序不能錯。調用任何函數都不能改變參數的順序,除非它有相應的重載(Overload)。因為這個順序是固定的,有些書里稱其為“定位參數”(意即“個數和位置固定的參數”)。
3. 對Attribute 實例的屬性的賦值可有可無。反正它會有一個默認值,並且屬性賦值的順序不受限制。有些書里稱屬性賦值的參數為“具名參數”。