在這篇指南裡,我們將會看到如何自己建立屬性(attribute),並將其用到不同的程式實體(entity)上,在程式執行時獲取屬性資訊。
屬性(attribute)是一種新型的宣告資訊。我們可以使用屬性來定義設計時的資訊(比如幫助檔案、文件的鏈結),以及執行時的資訊(比如將乙個類的域與乙個xml的域相關聯)。我們也可以用屬性來建立「自描述」的元件(可以提供該元件的描述資訊)。
在這篇指南裡,我們將會看到如何自己建立屬性 (attribute),並將其用到不同的程式實體(entity)上,並在程式執行時獲取屬性資訊。
屬性的概念 msdn(ms-help:裡是這樣定義的:屬性是乙個宣告的附加宣告。
使用預定義的屬性
c#已經預定義了一小組的屬性供我們使用。在學習如何建立乙個自定義的屬性前,我們先通過一段**來看看怎麼使用這些預定義的屬性吧。
using system;
public class anyclass
static void new( )
public static void main( )
}在這個例子裡我們使用了obsolete(「陳舊的」)屬性,它會將其所修飾的程式實體(類、方法、資料成員等)說明為已廢棄不用的。第乙個引數—乙個字串說明這個實體為何被廢棄、由誰代替。實際上這個字串的內容你想寫什麼都可以。
第二個引數則告訴編譯器將使用者對此實體的呼叫視作乙個編譯錯誤。這個引數的預設值為false,表示編譯器僅將使用者對其的呼叫視作警告。編譯上面這段**時,我們將會得到乙個編譯錯誤(譯註:
注意編譯錯誤後附的提示了嗎?):
is obsolete:「別用old這個老方法了,請用new方法」
開發自定義的屬性
現在開始開發我們自己的屬性吧。這兒有乙個小竅門:從c#定義的類派生我們的屬性類(從抽象基類直接或間接地派生乙個類,該派生類都是乙個屬性類。
乙個屬性類的宣告就定義了一種新的屬性型別),然後得到了這樣乙個宣告:
using system;
public class help : attribute{}
不管你相不相信,我們已經建立了乙個自定義的屬性。我們可以像這樣用它修飾任何的類:
[help()]
public class anyclass{}
注意: 在屬性類名與字尾attribute間存在乙個自動的編譯轉換。因此當我們用乙個屬性去修飾乙個程式實體時,不需要給出attribute這個字尾。
編譯器首先會在的所有派生類中進行匹配,如果沒有找到匹配屬性,它就將屬性名加上attribute字尾名後再進行匹配。
目前我們的這個屬性還沒什麼用,讓我們加點內容吧。在這個示例裡,我們為自定義的屬性類新增了乙個資料屬性description(property),我們將在本文的最後演示如何在執行時查詢這些資訊。
using system;
public class help : attribute
protected string description;
public string description}}
[help("這是個什麼也不做的類")]
public class anyclass{}
定義/控制自定義屬性的使用
attributeusage類是另乙個預定義的屬性類,以幫助我們控制自定義屬性的使用。即我們可以定義自定義屬性類的屬性。這個類描述了如何使用自定義的屬性類。
attributeusage有三個資料屬性可用以修飾我們的自定義的屬性:
1、validon:定義了自定義屬性在哪些程式實體上可被使用。這個可使用實體的列表可通過attributetargets列舉型別的or操作進行設定。
2、allowmultiple:定義了是否可在同乙個程式實體上同時使用多個屬性進行修飾。
3、inherited:定義了自定義屬性的修飾是否可由被修飾類的派生類繼承。
讓我們做點具體的吧。我們將會用乙個attributeusage屬性修飾我們的屬性類,以控制其作用範圍:
using system;
[attributeusage( allowmultiple = false, inherited = false ]
public class helpattribute : attribute
protected string description;
public string description }
}先看看說明了我們的help屬性只能用以修飾類,下面的這段**將會導致乙個編譯錯誤(「屬性 help不能用在這樣的宣告上,它只能用在類的宣告上」),因為我們用help屬性去修飾方法anymethod()了:
[help("this is a do-nothing class")]
public class anyclass
}編譯錯誤:
attribute ''help'' is not valid on this declaration type.
it is valid on ''class'' declarations only.
當然我們可以來允許help屬性修飾任何型別的程式實體。attributetargets可能的值包括:
assembly, module, class, struct, enum, constructor, method, property, field, event,
inte***ce, parameter, delegate,
all = assembly | module | class | struct | enum | constructor | method | property | field | event | inte***ce | parameter | delegate,
classmembers = class | struct | enum | constructor | method | property | field | event | delegate | inte***ce )
接下來,該看看allowmultiple = false這句了:它確定了不能像下面這樣,在同一實體上同時使用多個同種屬性進行修飾:
[help("this is a do-nothing class")]
[help("it contains a do-nothing method")]
public class anyclass
}編譯錯誤:
duplicate ''help'' attribute
我們再來談談attributeusage的最後乙個資料屬性inherited:定義了自定義屬性的修飾是否可由被修飾類的派生類繼承。基於下示**表示的繼承關係,讓我們看看會發生什麼吧:
[help("baseclass")]
public class base{}
public class derive : base{}
我們選擇了attributeusage的四種組合:
[attributeusage( allowmultiple = false, inherited = false ]
[attributeusage( allowmultiple = true, inherited = false ]
[attributeusage( allowmultiple = false, inherited = true ]
[attributeusage( allowmultiple = true, inherited = true ]
對應上述組合的結果:
如果我們查詢(稍後我們會看見如何在執行時查詢乙個類的屬性資訊。)這個derive類的help屬性時,會因其未從基類繼承該屬性而一無所獲。因為同樣的原因,得到與結果不同樣的結果。
為了解釋這後面的兩種情況,我們把同樣的屬性也用在這個derive派生類上,**修改如下:
[help("baseclass")]
public class base{}
[help("deriveclass")]
public class derive : base{}
EXCEL自定義格式
用以下一段技巧來慶祝我轉正版主 一下excel中的自定義格式 本來想把下面的總結寫成一遍文的,但看了一下手頭的資料,覺得沒必要了,就直接寫條件和如何操作吧。1 若要大於等於60分的成績顯示為黑色,小於60的資料顯示紅色,則自定義為 紅色 60 黑色 60 2 若要資料以小數點對齊,自定義為 不過此格...
自定義設定技巧
如果要更改工作表的名字,一般都是利用 重新命名 命令來完成的。請問還有其他快速的方法嗎?答 其實只要用滑鼠左鍵雙擊工作表標籤名稱,然後就可以直接輸入新的名稱了。系統能夠自動為其自帶的資料型別 如星期 季度等 進行排序。請問如何讓自己定義的資料型別實現自動排序?答 要讓系統自動排序我們自己定義的資料型...
自定義MVC框架
本章按照mvc的思路,我們實現乙個自定義的mvc框架 山寨版struts 1.新建web工程 2.新建serlvet,這個servlet是中心控制器 在mvc設計模式中,我們要將所有的請求 例如,所有以 do結尾的請求 交給同乙個servlet來處理,我們在請求這個servlet的時候,告訴這個se...