學習參考:
今天在討論ipc通訊契約的時候,盧工提到使用attribute來描述具體的介面方法的命令資訊。發現對 attribute的概念還不是很熟悉,因此對其進行學習梳理。
1、attribute是什麼?它有什麼用?
先來看看官方的定義:
msdn文件對它的描述:公共語言執行時允許新增類似關鍵字的描述宣告,叫做attributes, 它對程式中的元素進行標註,如型別、字段、方法和屬性等。attributes和microsoft .net framework檔案的元資料儲存在一起,可以用來向執行時描述你的**,或者在程式執行的時候影響應用程式的行為。簡單的定義:本質上是乙個類,其為目標元素提供關聯附加資訊,並在執行期以反射的方式來獲取附加資訊。具體的特性實現方法,在接下來的討論中繼續深入。
看定義總是有距離感,還是看看實際的應用吧。
2、常用場景
.net中常見的attribute:
#define debug //這裡定義條件
using
system;
using
system.runtime.interopservices;
using
system.diagnostics;
namespace
attributedemo
[conditional(
"debug")]
private
static
void
displayrunningmessage()
[conditional(
"debug")]
[obsolete]
private
static
void
displaydebugmessage()
}}
如果在乙個程式元素前面宣告乙個attribute,那麼就表示這個attribute被施加到該元素上,前面的**,[dllimport]施加到messagebox函式上, [conditional]施加到displayruntimemessage方法和displaydebugmessage方法,[obsolete]施加到displaydebugmessage方法上。attribute類是在編譯的時候被例項化的,而不是像通常的類那樣在執行時候才例項化。
3、自定義特性
1、自定義的attribute必須直接或者間接繼承system.attribute。
2、所有自定義的特性名稱都應該有個attribute字尾,命名規範為:"類名"+attribute
3、使用attributeusage來限定你的attribute 所施加的元素的型別,attributeusage本身也是乙個attribute。它有乙個帶引數的構造器,這個引數是attributetargets的列舉型別
publicenum
attributetargets
此外,attributeusage還定義了以下三個屬性:
allowmultiple::讀取或者設定這個屬性,表示是否可以對乙個程式元素施加多個attribute 。
inherited:讀取或者設定這個屬性,表示是否施加的attribute 可以被派生類繼承或者過載。
validon::讀取或者設定這個屬性,指明attribute 可以被施加的元素的型別。
下面是乙個自定義特性的例子,摘自這裡:
usingsystem;
using system.reflection; //
應用反射技術獲得特性資訊
namespace
anytao.net
public myselfattribute(string name, int
age)
//定義屬性
//顯然特性和屬性不是一回事兒
public
string
name
}public
intage
}public
string
memo
set
}//定義方法
public
void
showname()
", _name == null ? "
world.
": _name);}}
//應用自定義特性
//可以以myself或者myselfattribute作為特性名
//可以給屬性memo賦值
[myself("
emma
", 25, memo = "
emma is my good girl.")]
public
class
mytest
}public
class
myrun
", myattribute.name);
console.writeline(
"age:
", myattribute.age);
console.writeline(
"memo of is
", myattribute.name, myattribute.memo);
myattribute.showname();
}//多點反射
object obj = activator.createinstance(typeof
(mytest));
methodinfo mi = tp.getmethod("
sayhello");
mi.invoke(obj,
null
); console.readline();}}
}
4、使用flagsattribute修飾列舉
flagsattribute屬性就是列舉型別的一項可選屬性。它的主要作用是可以將列舉作為位域處理,所謂位域是單個儲存單元內相鄰二進位制位的集合。在.net framework中有很多列舉都是用flagsattribute特性修飾,例如:正規表示式選項system.text.regularexpressions.regexoptions、檔案監視中的檔案改變型別system.io.watcherchangetypes、system.web.ui.webcontrols.datacontrolrowstate等等。
使用flagsattribute需要注意:
1、只有要對數值執行按位運算(and、or、xor)時才對列舉使用 flagsattribute 自定義屬性。
2.、必須用 2 的冪(即 1、2、4、8 等)定義列舉常量。
usingsystem;
class
flagsattributedemo
; [flagsattribute]
enum color2 : short
;
static
void
main()
", mycolor1);
color1 mycolor_1 = color1.red |color1.blue;
//我先不執行計算一下看看是那個:0001|0100=0101 應該是5
console.writeline("
mycolor_1=
",mycolor_1);
console.writeline(
"測試使用flagsattribute屬性");
color2 mycolor2 = color2.red |color2.blue;
//我先不執行計算一下看看是那個:0001|0100=0101應該是red,blue
console.writeline("
mycolor2=
", mycolor2);
console.readkey();
}}
Attribute 學習筆記
一 attribute 是為目標元素新增附加資訊的一種描述宣告,在執行的時候通過反射的方式來獲取附加的資訊。二 使用attributeusage來定義自定義attribute的屬性,attributeusage本身也是乙個attribute,這是專門施加在attribute類的attribute.a...
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...
C 特性Attribute學習
起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...