C# 讀取特性
要讀取特性的值,我們必須使用一種稱(chēng)為“反射(reflection)”的技術(shù)。這種非常高級(jí)的技術(shù)讓我們可以在運(yùn)行的時(shí)候動(dòng)態(tài)檢査類(lèi)型信息,甚至是在創(chuàng)建對(duì)象的位置,或者在不必知道具體對(duì)象的情況下直接調(diào)用某個(gè)方法。在使用特性之前,需要了解該技術(shù)的一些基本知識(shí)。有關(guān)該技術(shù)的更多信息,可以訪問(wèn) https://docs.microsoft.com/eii-us/dotnet/framework/reflection-and-codedom/reflection。
簡(jiǎn)單來(lái)說(shuō),反射可以取得保存在Type對(duì)象(本書(shū)中會(huì)多次提到該對(duì)象)中的使用信息,以及通過(guò)System.Reflection名稱(chēng)空間中的各種類(lèi)型來(lái)獲取不同的類(lèi)型信息。在此之前,我們己經(jīng)了解過(guò)通過(guò)typeof運(yùn)算符從類(lèi)中快速獲取類(lèi)型信息,以及使用GetType()方法從對(duì)象實(shí)例中獲取信息的方法。通過(guò)反射技術(shù),我們可繼續(xù)從Type對(duì)象取得成員信息?;谶@個(gè)方法,我們就可以從類(lèi)或類(lèi)的不同成員中取得特性信息了。
為此,最簡(jiǎn)單的方法即通過(guò)Type.GetCustomAttributes()方法來(lái)實(shí)現(xiàn)。這個(gè)方法最多使用兩個(gè)參數(shù),然后返回一個(gè)包含一系列object實(shí)例的數(shù)組,每個(gè)實(shí)例都是一個(gè)特性實(shí)例。第一個(gè)參數(shù)是可選的,即傳遞我們感興趣的類(lèi)型或若干特性的類(lèi)型(其他所有特性均會(huì)被忽略)。如果不使用這—參數(shù),將返回所有特性。第二個(gè)參數(shù)是必需的,即通過(guò)一個(gè)布爾值來(lái)指示,只想了解類(lèi)本身的信息,還是除了該類(lèi)之外還希望了解派生自該類(lèi)的所有類(lèi)。
例如,下面的代碼可以列出DecoratedClass類(lèi)的特性:
Type classType = typeof(DecoratedClass);
object[] customAttributes = classType.GetCustomAttributes(true);
foreach (object customAttribute in customAttributes)
{
WriteLine($"Attribute of type {customAttribute} found.");
}
通過(guò)這種方法了解到不同的特性后,我們就可以為不同的特性采取不同的操作了。這也正是當(dāng)Visual Studio遇到前面介紹的DebuggerStepThroughAttribute特性時(shí)所執(zhí)行的操作。
點(diǎn)擊加載更多評(píng)論>>