在現實世界中,您使用過自定義.NET屬性的是什麼類型的東西?真實世界中使用自定義.NET屬性
我已經閱讀了幾篇關於它們的文章,但我從未使用過自定義屬性。
我覺得我可能會忽視他們,當他們可以有用。
我說的是你創建的屬性,而不是已經包含在框架中的屬性。
在現實世界中,您使用過自定義.NET屬性的是什麼類型的東西?真實世界中使用自定義.NET屬性
我已經閱讀了幾篇關於它們的文章,但我從未使用過自定義屬性。
我覺得我可能會忽視他們,當他們可以有用。
我說的是你創建的屬性,而不是已經包含在框架中的屬性。
我已經使用它們的「自定義」屬性進行驗證(即標記一個字段以驗證我自己的「信用卡驗證」)和我寫的自定義LinqToLucene分析器(即指定要使用哪個分析器給定的字段)。
驗證碼,例如,會是這個樣子:
public class Customer
{
[CreditCardValidator]
string creditCardNumber;
[AddressValidator]
string addressLineOne
}
當上述對象進行驗證,每個字段相應的驗證多虧了「定製」屬性與驗證。
在LinqToLucene中,我編寫的自定義屬性很好,因爲它們允許您在運行時查找(通過反射)特定字段。例如,如果您有客戶對象,則可能有興趣獲取已標記爲「索引我」的所有屬性:自定義屬性可讓您輕鬆完成此操作,因爲它以一種方式公開有關對象的元數據很容易查詢。
我不得不將某些對象序列化爲自定義(傳統)格式,並且我使用屬性來確定應該序列化哪些字段以及如何格式化它們。然後我有一個序列化器,可以使用這些屬性的任何對象,並使用反射來設置它的格式。
您不是'你真的使用自己的自定義屬性嗎? – 2009-06-21 04:47:46
heeeeeeeeeeeeee – abmv 2009-06-21 10:05:09
我曾經在一個基於ActiveRecord模式開發的ORM框架中使用過它。這是LINQ,Castle項目中可用的相同類型的實現。
該框架被稱爲「SkyFramework」,但它不是開源的。
例如,只是一個粗略的例子...
你會在其他開源項目中找到類似的例子。
[Sky.Table ("user")]
public class User
{
[Sky.Column ("username")]
public string UserName;
[Sky.Column ("pwd")]
public string Password;
}
注:該屬性爲「表」,「列」是當時的自定義屬性。
ActiveRecord的引擎解析這些屬性的對象和用於CRUD生成的各個功能...等...
同樣,我已經開發用於識別需要被基準代碼部分一些自定義屬性。 ..for例如:
[Sky.BenchMark()]
public void LongRunningMethod(..)
{
}
標有上述屬性的方法會自動進行基準標記並生成日誌。這些是一些較早的實現。
有一個關於主題的Apress書籍。 Applied .NET Attribues這可能對你有幫助。
除此之外,我用它們來指定EBNF,它在運行時被讀取以動態地創建自定義分析器,並指定關於數據庫字段的元數據。
我發現一個'模式'我通常使用自定義屬性是取代枚舉,特別是當在代碼中的不同位置的枚舉依賴。
E.g.我可能會得到一個對象狀態的枚舉。基於這種狀態,我可能會有3或4個不同的代碼位置,我會對該枚舉進行「切換」並執行一些操作。其他開發人員可以通過添加新的枚舉來輕鬆地引入錯誤,但不能在代碼中其他位置的某個switch語句中處理。
因此,爲了避免這種情況,我創建了一個聲明爲靜態類的自定義屬性。自定義屬性在類的靜態構造函數中加載到字典中,代碼中的所有位置都使用字典而不是switch語句。自定義屬性構造函數包含每個switch語句的「硬編碼」值。
我創建了一個腳本引擎,並用[Command]屬性標記了各種方法。這意味着這些函數暴露給腳本引擎。
例子:
[Command(HelpText = "Lists active users")]
void ListUsers(void)
{
}
[Command(HelpText = "Terminate a specific user's connection")]
void EndConnection(int userID)
{
}
而且所用:
MyScriptEngine>> Help
Available Commands are:
ListUsers: Lists active users
EndConnection {userID}: Terminate a specific user's connection
MyScriptEngine>> EndConnection 3
User 3 (Michael) has had his connection terminated.
MyScriptEngine>>
我還沒有真正找到了一個自定義屬性,使用作爲尚未。出現了一些情況,我認爲它們可能是合適的,但沒有使用它們,因爲顯然在閱讀定製屬性時涉及到的反思非常昂貴。
我已將自定義屬性放在「插件」DLL中的類上。這允許框架動態發現可用的插件,評估它們是否感興趣,然後動態加載感興趣的插件。
在我們的領域,這個例子是插件,它爲一個家庭中的特定車輛建模。車輛系列的一個插件實際上可以模擬車輛系列中的多個車輛模型(例如,「MX-6」,「探針」)。如果ID或模型名稱作爲自定義屬性數組包含在內,我們可以快速忽略任何甚至沒有自定義屬性的DLL,然後進一步忽略那些沒有對感興趣車輛建模的任何DLL。
以下是其他SOFlow'rs使用它們的方式:http://www.google.com/#hl=zh-CN&q=site%3Astackoverflow.com+.net+custom+attribute&aq=f&oq=&aqi=&fp=leBsIIJAIN0 – Sampson 2009-06-21 04:17:14