8

在現實世界中,您使用過自定義.NET屬性的是什麼類型的東西?真實世界中使用自定義.NET屬性

我已經閱讀了幾篇關於它們的文章,但我從未使用過自定義屬性。

我覺得我可能會忽視他們,當他們可以有用。

我說的是你創建的屬性,而不是已經包含在框架中的屬性。

+2

以下是其他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

回答

4

我已經使用它們的「自定義」屬性進行驗證(即標記一個字段以驗證我自己的「信用卡驗證」)和我寫的自定義LinqToLucene分析器(即指定要使用哪個分析器給定的字段)。

驗證碼,例如,會是這個樣子:

public class Customer 
{ 
    [CreditCardValidator] 
    string creditCardNumber; 

    [AddressValidator] 
    string addressLineOne 
} 

當上述對象進行驗證,每個字段相應的驗證多虧了「定製」屬性與驗證。

在LinqToLucene中,我編寫的自定義屬性很好,因爲它們允許您在運行時查找(通過反射)特定字段。例如,如果您有客戶對象,則可能有興趣獲取已標記爲「索引我」的所有屬性:自定義屬性可讓您輕鬆完成此操作,因爲它以一種方式公開有關對象的元數據很容易查詢。

0

我不得不將某些對象序列化爲自定義(傳統)格式,並且我使用屬性來確定應該序列化哪些字段以及如何格式化它們。然後我有一個序列化器,可以使用這些屬性的任何對象,並使用反射來設置它的格式。

+0

您不是'你真的使用自己的自定義屬性嗎? – 2009-06-21 04:47:46

+0

heeeeeeeeeeeeee – abmv 2009-06-21 10:05:09

0

我曾經在一個基於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這可能對你有幫助。

1

除此之外,我用它們來指定EBNF,它在運行時被讀取以動態地創建自定義分析器,並指定關於數據庫字段的元數據。

我發現一個'模式'我通常使用自定義屬性是取代枚舉,特別是當在代碼中的不同位置的枚舉依賴。

E.g.我可能會得到一個對象狀態的枚舉。基於這種狀態,我可能會有3或4個不同的代碼位置,我會對該枚舉進行「切換」並執行一些操作。其他開發人員可以通過添加新的枚舉來輕鬆地引入錯誤,但不能在代碼中其他位置的某個switch語句中處理。

因此,爲了避免這種情況,我創建了一個聲明爲靜態類的自定義屬性。自定義屬性在類的靜態構造函數中加載到字典中,代碼中的所有位置都使用字典而不是switch語句。自定義屬性構造函數包含每個switch語句的「硬編碼」值。

5

我創建了一個腳本引擎,並用[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>> 
0

我還沒有真正找到了一個自定義屬性,使用作爲尚未。出現了一些情況,我認爲它們可能是合適的,但沒有使用它們,因爲顯然在閱讀定製屬性時涉及到的反思非常昂貴。

0

我已將自定義屬性放在「插件」DLL中的類上。這允許框架動態發現可用的插件,評估它們是否感興趣,然後動態加載感興趣的插件。

在我們的領域,這個例子是插件,它爲一個家庭中的特定車輛建模。車輛系列的一個插件實際上可以模擬車輛系列中的多個車輛模型(例如,「MX-6」,「探針」)。如果ID或模型名稱作爲自定義屬性數組包含在內,我們可以快速忽略任何甚至沒有自定義屬性的DLL,然後進一步忽略那些沒有對感興趣車輛建模的任何DLL。