使用.NET框架編寫Windows程序,在很多方面已經變得很簡單。在許多情況下,.NET框架使用,.NET編譯器在編譯時綁定到程序集的元數據,.使靈活的程序設計變得更容易。事實上,對於.NET而言,使用內嵌的元數據把我們從DLL地獄解脫出來是可能的。
值得慶幸的是,.NET框架的設計者們並沒有選擇把這些元數據優雅的隱藏起來。設計者們把反射API給予了我們,通過反射,一個.NET程序可以通過編程查看這個元數據。一個程序可以反射出包含在特定程序集內任意的東西,或者說是包含在其內的所有的類型和成員。
把元數據綁定到可執行的程序集裡,提供了許多優勢。這使得.NET程序集,完全可以自我描述。還允許開發者跨語言共享組件,去除了頭文件的需要。(這些頭文件會由於相關的實現代碼而過期。)
關於.NET元數據所有積極的消息,看起來很難相信,它好像什麼也沒有,僅僅是個謊言。但是,它確實是存在的。在.NET裡,你可以創建自己特定程序的元數據,並且可以把這些元數據應用到你可以想象到的地方。
開發者通過使用自定義特性,可以定義他們自己特定程序的元數據。因為這些特性的值將變成另一部分元數據,綁定到一個程序集裡。所以這些自定義特性的值可以被反射API檢查到並且可以被使用。
我們經常提到一個類的屬性,這些屬性的值可以作為特性來使用。那麼屬性和自定義特性真正的區別在哪裡呢?
通過這篇文章,你將學會如何定制特性,如何把特性應用到你的源代碼類和方法上,以及如何使用反射API獲取和使用這些特性的值。
公共語言運行時是如何使用特性的?
在你開始考慮如何使用你自己定義的特性類之前,讓我們查看一些標准的特性,這些已經在公共語言運行時有用到。
[WebMethod]特性提供了一個簡單的例子。它可以使WebService派生的子類中任意公共的方法轉化成Web Service暴露方法的一部分,而這一切,僅僅通過把[WebMethod]附加到方法的定義上就可以做到。
你只要把[WebMethod]特性添加到一個方法上,.NET就會在後台為你處理其它所有的事情。
在給定的方法上使用[Conditional]特性,那麼此方法是否可調用將取決於指定的預處理標識符是否被定義。舉個例子,看如下的代碼: