特性(摘要)
特性(摘要)
特性(attribute),讓我們可以為代碼標記一些信息,而這樣的信息又可以從外部讀取,并通過各種方式來影響我們所定義的類型的使用方式。這種手段通常被稱為對代碼進行“裝飾(decorating)”。
舉例來說,比如我們要創建的某個類包含了一個極其簡單的方法(簡單到我們不必去理會他)。但在應用程序調試期間,可能還是不得不通過代碼的逐行檢查而調試它。在這種情況下,我們就可以對該方法添加一個特性,告訴VS在調試時不要進入該方法進行逐句調試,而是應該跳過該方法直接調試下一條語句。這樣的特性申明方式如下:
[DebuggerStepThrough] public void DullMethod() {... }上述代碼中所包含的特性就是[DebuggerStepThrough]。所有特性的添加方式都是如此,也就是說只需將特性名稱用方括號括起來,并寫在要應用的目標代碼前面即可。并且可以為一段代碼添加多個特性,將這些特性用(,)分隔開,或者用多個方括號括起來每一個均可
上述代碼中所使用的特性實際上是通過DebuggerStepThroughAttribute這個類來實現的,而這個類位于System.Diagnostics名稱空間中,因此如果我們要使用上面那個特性,就必須使用using 語句來引用這一名稱空間。引用該特性既可以直接使用其完整名稱,也可以像前面的代碼那樣,去掉后綴Attribute。
通過上述方式添加特性后,編譯器就會創建該特性類的一個實例,然后將其與類方法關聯起來。某些特性可以通過構造函數的參數或屬性進行自定義,并在添加特性的時候進行指定,例如:
[DoesInterstingThings(1000,WhatDoesItDo="voodo")] public class DecoratedClass {... }上述特性的值1000傳遞給了DoesInterestingThingsAttribute的構造函數,并將WhatDoesItDo屬性的值設置為字符串"voodoo"。
?
讀取特性:
要讀取特性,我么必須使用一種稱為“反射(reflection)“的技術。這種非常高級的技術讓我們可以在運行的時候動態檢查類型的信息,甚至是在創建對象的位置,或者在不必知道具體對象的情況下調用某個方法。
簡單來說,反射可以獲取保存在Type對象中的信息,以及通過System.Reflection名稱空間中的類型來獲取不同的類型信息。在此之前,我們已經通過typeof運算符從類中快速的獲取類型信息,以及使用GetType()方法從對象實例中獲取信息的方法。通過反射技術,我們可以繼續從Type對象獲取成員信息。基于這個方法,我們就可以從類或類的不同成員中獲取特性信息了。
為此,最簡單的方法也就是通過Type.GetCustomAttribute()方法來實現。這個方法最多使用兩個參數,然后返回一個包含一系列object實例的數組,每個實例都是一個特性實例。第一個參數是可選的,即傳遞我們感興趣的類型或若干特性的類型(其他所有特性均會被忽略)。如果不使用這一參數,將返回所有特性。第二個參數是必須的,即通過一個布爾值來指示,只想了解類本身的信息,還是除了該類之外還希望了解派生類得的所有類
例如,下面的代碼可以列出DecoratedClass這個類的所有特性:
Type classType = typeof(DecoratedClass); object[] customAttributes = classType.GetCustomAttribute(true); foreach(object customAttribute in customAttributes) {Console.WriteLine("Attribute of type {0} found.",customAttribute); }通過這種方法了解了不同特性之后,我們就可以為不同的特性采取不同的操作了。這也正是當VS遇到前面介紹的DebuggerStepThroughAttribute特性時所采取的操作。
轉載于:https://www.cnblogs.com/SilentCode/p/4883944.html
總結
- 上一篇: php 不能同时提交form
- 下一篇: java文本输入输出小结