C 特性Attribute的基礎與簡單使用

2021-09-29 18:40:51 字數 1904 閱讀 2775

什麼是特性

公共語言執行時使你能夠新增類似於關鍵字的描述性宣告(稱為特性),以便批註程式設計元素(如型別、字段、方法和屬性)。

編譯執行時的**時,它將被轉換為 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...