一、基礎知識點
1、什麼是attribute?
msdn:公共語言執行時允許你新增類似關鍵字的說明,叫做attribute,它可以對程式中的元素進行標註,如型別、字段、方法和屬性等.attributes和microsoft .net framework檔案的元資料儲存在一起,可以用來向執行時描述你的**,或者在程式執行的時候影響應用程式的行為。在.net中,attribute被用來處理多種問題,比如序列化、程式的安全特徵、防止即時編譯器對程式**進行優化從而**容易除錯等等.
2、attribute作為編譯器的指令
attribute作為編譯器的指令數量不受限制,大致有以下三個attribute:
(1)、conditional:起條件編譯的作用,只有滿足條件,才允許編譯器對它描述的**進行編譯。一般在程式除錯時使用。
staticconditional對滿足引數的定義條件的**進行編譯,如果沒有定義debug,那麼該方法將不被編譯,讀者可以把#define debug一行注釋掉看看輸出的結果(release版本,在debug版本中conditional的debug總是成立的)void main(string
args)
[conditional(
"debug")]
static
void
displayrunningmessage()
(2)、dllimport:用來標記非.net的函式,表明該方法在乙個外部的dll中定義
staticdllimport用於呼叫c或者c++等外部的dll程式集,其修飾的方法必須是外部程式集的主入口。void main(string
args)
", result);
console.readkey();
}[dllimport(
"classlibrary1.dll")]
public
static
extern
int test(int a,int b);
(3)、obsolete:這個屬性用來標記當前的方法已經被棄用,不再使用了。
3、自定義attribute類
除了.net提供的那些attribute派生類之外,我們可以自定義我們自己的attribute,所有自定義的attribute必須從attribute類派生。下面來簡單說明下attribute類:
(1)、attribute類基本知識點
protected attribute(): 保護的構造器,只能被attribute的派生類呼叫。
static attribute getcustomattribute():這個方法有8種過載的版本,它被用來取出施加在類成員上指定型別的attribute。
static attribute getcustomattributes(): 這個方法有16種過載版本,用來取出施加在類成員上指定型別的attribute陣列。
static bool isdefined():由八種過載版本,看是否指定型別的定製attribute被施加到類的成員上面。
bool isdefaultattribute(): 如果attribute的值是預設的值,那麼返回true。
bool match():表明這個attribute例項是否等於乙個指定的物件。
公共屬性: typeid: 得到乙個唯一的標識,這個標識被用來區分同乙個attribute的不同例項。
上面是attribute的基本知識點,想要了解詳細的資訊,請使用reflector檢視源**;
(2)、自定義attribute類命名規則
命名規則:attribute的類名+"attribute",當你的attribute施加到乙個程式的元素上的時候,編譯器先查詢你的attribute的定義,如果沒有找到,那麼它就會查詢「attribute名稱"+attribute的定義。如果都沒有找到,那麼編譯器就報錯。 ---如testattribute
(3)、給自定義attribute限定施加的元素的型別 ---attributeusage
通過attributeusage來給我們自定義的attribute限定施加元素的型別,**形式如下:
[attributeusage(引數設定)]非常有意思的是attributeusage也是乙個attribute,這個是專門施加在attribute上的attribute,attributeusage自然也是從attribute派生而來的,它有乙個帶引數的構造器,這個引數是attributetargets的列舉型別public
class
testattribute:attribute
注意:flags特性,說明作為引數的attributetarges的值允許通過「|」操作來進行多個值得組合。如果你沒有指定引數,那麼預設引數就是all
除了attributetarges引數外,attributetarges還允許傳入另外兩個引數:
allowmultiple: 讀取或者設定這個屬性,表示是否可以對乙個程式元素施加多個attribute 。
inherited:讀取或者設定這個屬性,表示是否施加的attribute 可以被派生類繼承或者過載。
(4)、attributeusage的使用例子
class上面定義了乙個test屬性,並通過attributeusage設定該屬性只對類有效,但是program類中卻用它修飾方法,所以程式報錯,抱錯資訊如下:program
[test]
static
void
testmethod()
}//////
通過attributeusage設定test屬性只對類有效
///[attributeusage(attributetargets.class)]
public
class
testattribute:attribute
二、attribute高階應用
1、描述乙個單元類的檢查資訊
通過attribute描述乙個類的檢查資訊
using通過反射獲取becheckedclass類,在通過attribute.getcustomattribute獲取becheckedclass類的描述特性值,從而實現這個功能!system;
using
system.collections.generic;
using
system.diagnostics;
using
system.linq;
using
system.runtime.interopservices;
using
system.text;
using
system.threading.tasks;
namespace
", attri.reviewer);
console.writeline(""
, attri.date);
console.writeline(
"備註:
", attri.comment);
console.readkey();}}
}[codereviewattribute("小超
", "
2017-6-12
", comment = "
檢查通過")]
public
class
becheckedclass
//////
**檢查屬性
///[attributeusage(attributetargets.class)]
public
class
codereviewattribute: attribute
public
string
reviewer
}public
string
date
}public
string
comment
set }}}
本文參考自attribute在.net程式設計中的應用(一)
Attribute的基本概念
經常有朋友問,attribute是什麼?它有什麼用?好像沒有這個東東程式也能執行。實際上在.net中,attribute是乙個非常重要的組成部分,為了幫助大家理解和掌握attribute,以及它的使用方法,特地收集了幾個attribute使用的例子,提供給大家參考。在具體的演示之前,我想先大致介紹一...
Attribute特性使用
特性是用於在執行時傳遞程式中各種元素行為資訊的宣告性標籤加粗樣式,乙個宣告標籤是通過放置在它所應用的元素前的方括號來描述。在.net框架裡提供了兩種型別的特性 預定義特性 自定義特性 attributeusage attributetargets.class,allowmultiple true i...
Attribute 學習筆記
一 attribute 是為目標元素新增附加資訊的一種描述宣告,在執行的時候通過反射的方式來獲取附加的資訊。二 使用attributeusage來定義自定義attribute的屬性,attributeusage本身也是乙個attribute,這是專門施加在attribute類的attribute.a...