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