什麼是特性
公共語言執行時使你能夠新增類似於關鍵字的描述性宣告(稱為特性),以便批註程式設計元素(如型別、字段、方法和屬性)。
編譯執行時的**時,它將被轉換為 microsoft 中間語言 (msil),並和編譯器生成的元資料一起放置在可移植可執行 (pe) 檔案內
自定義特性類
特性類是直接或間接派生自 attribute 的類,下面定義乙個叫author的特性,attributeusage特性是對新特性的一限制。
[attributeusage(attributetargets.class, inherited = false, allowmultiple = false)]
public class author : system.attribute
}
可按如下方式使用這一新特性:
[author("p. ackerman", version = 1.1)]
class sampleclass
關於attributeusage
使用attributeusage,來控制如何應用新定義的特性,這非必要的。
[attributeusage(attributetargets.class, inherited = false, allowmultiple = true)]
attributetargets 成員
上述示例中指定了 attributetargets.all,它表示此特性可應用於所有程式元素。 或者,你可指定 attributetargets.class 和 attributetargets.method,前者表示你的特性僅可適用於乙個類,後者表示你的特性僅可應用於一種方法
inherited 屬性
指明要對其應用屬性的類的派生類能否繼承此屬性,預設可以繼承
allowmultiple 屬性
指明元素能否包含屬性的多個例項。一般乙個特性乙隻會指定一次,預設false只能指定一次,但是如果allowmultiple=true,通過此命名引數可一次或多次使用自定義特性。 下面的**示例建立了乙個多用特性。
[attributeusage(attributetargets.class, inherited = false, allowmultiple = true)]
public class author : system.attribute
在下面的**示例中,某個類應用了同一型別的多個特性。
[author("p. ackerman", version = 1.1)]
[author("r. koch", version = 1.2)]
class sampleclass
特性的應用
下面實現讀取列舉中文注釋的特性,先定義乙個remark特性
public class remarkattribute : attribute
public remarkattribute(string remark)
}
為列舉擴充套件乙個方法,用於使用特性,主要是通過反射得到傳入列舉的特性的類,再得到這類的屬性。
public static string getremark(this enum value)
else
}
可按如下方式使用這一新特性:
state state = state.frozen;
string reamrk = state.getremark();//輸出reamrk的值為:已凍結
總結
特性是要繼承attribute類,特性的使用主要都通過反射。
參考
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
C 中的特性標籤 Attribute
這節講一下 特性 attribute 特性,是用來給 新增額外資訊的一種手段,我們通常是將特性標記到方法,類或者屬性上,在使用的這些結構的時候,通過反射 reflection 這一非常高階的技術,獲取它們通過特性標記的資訊,從而進行某些特殊的處理。系統也給我們提供了一些特性,比如serializab...