2009-10-20 71 views
1

我想實現一個簡單的屬性,用於將數據庫列映射到屬性。如何讓一個屬性知道它所在的屬性的名稱?

所以我至今是一些附加像這樣:

[DataField("ID")] 
    public int ID { get; set; } 

    [DataField("Name")] 
    public String Name { get; set; } 

    [DataField("BirD8")] 
    public DateTime BirthDay { get; set; } 

有沒有一種方法,我可以讓屬性是在球場上的「知道」,這樣的特性,其中該名稱與ColumnName相同,我只需應用不帶名稱參數的屬性,或者我必須在反映屬性的位置處理該屬性。我想最後做只是這一點:

[DataField] 
    public int ID { get; set; } 

    [DataField] 
    public String Name { get; set; } 

    [DataField("BirD8")] 
    public DateTime BirthDay { get; set; } 

回答

3

本身不會知道什麼它應用到的屬性,但代碼處理的屬性有可能通過PropertyInfo值等運行並找到與它們相關的屬性。 然後代碼可以適當地使用屬性和屬性。

爲了讓事情變得更簡單,你可能想要寫的屬性的方法,以允許它與從屬性中的信息合併的信息,所以你會打電話:

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal 
dfa = dfa.MergeWith(propertyInfo); 

注意,對於爲了理智,這應該創建一個屬性的新實例,而不是改變現有的實例。或者,你可能需要一個完整而獨立的類來表示「有關數據字段中的信息」:

DataFieldAttribute dfa = propertyInfo.GetCustomAttributes(...); // As normal 
DataFieldInfo info = dfa.MergeWith(propertyInfo); 

這種方法你可以構建DataFieldInfo對象沒有任何參考的屬性,這可能是一個很好的概念分離 - 允許您輕鬆地從XML文件或類似的東西加載配置,如果你想。

+1

只有當您不擁有處理屬性的代碼時纔會出現問題。我們面臨着本地化屬性的問題,它也可能是驗證屬性和其他問題。我們有一些屬性,我們需要將屬性的名稱和它定義的類的類型作爲參數傳遞 - 這非常糟糕。 – 2009-10-20 07:01:58

+0

如果您不擁有處理屬性的代碼,那麼假設它的設計假定屬性總是具有限制 - 即無法訪問目標。我同意這有點痛苦。 – 2009-10-20 07:09:15

+0

謝謝。我設法在解決方案中扼殺了我反映的屬性。 – 2009-10-28 07:14:34

1

如果你不介意使用postsharp,你可以看看Here,在之前的問題中,我問過哪個接近。我最終使用編譯時驗證來做我想做的事,儘管還有其他選項,比如CompileTimeInitalize。

public override void CompileTimeInitialize(object element) 
{ 
    PropertyInfo info = element as PropertyInfo; 

    //.... 
} 
+0

謝謝。我無法在這裏使用這種方法,但我現在知道postsharp存在以及它可以做什麼。非常感激。 – 2009-10-28 07:15:39

相關問題