2010-06-29 203 views
0

因爲我沒有在我的Google和網站搜索中看到這個問題的答案,所以我認爲我會在這個網站上構成偉大的頭腦。由於C#不支持泛型屬性(這是有道理的),我想知道是否有辦法將參數/屬性的類型限制爲基於它裝飾的類型的屬性。例如:自定義屬性和類型檢查

[AttributeUsage(AttributeTargets.Property)] 
public class ColumnBindAttribute : Attribute 
{ 
    public string ColumnName { get; set; } 
    public object DefaultValue { get; set; } 
} 

[ColumnBind(ColumnName = "Category", DefaultValue = "No Category")] 
public int CategoryId { get; set; } 

現在清楚,當我嘗試將此屬性爲它的默認值綁定,我會收到一個錯誤投。好奇的是,如果無論如何強制將DefaultValue的類型強制爲int,還是僅限於運行時檢查。

在此先感謝

回答

2

據我所知,目前還沒有辦法執行對屬性的單一屬性特定類型的檢查。然而,讓我注意,這不是最優雅的解決方案,你可以使用多態,你的優勢:

[AttributeUsage(AttributeTargets.Property)] 
public class ColumnBindAttribute: Attribute 
{ 
    public string ColumnName { get; set; } 
    public object DefaultUntypedValue 
    { 
     get; 
     protected set; 
    } 
} 

[AttributeUsage(AttributeTargets.Property)] 
public class ColumnBindGenericAttribute<T> : ColumnBindAttribute 
{  
    public T DefaultValue 
    { 
     get { return (T)DefaultUntypedValue; } 
     set { DefaultUntypedValue = value; } 
    } 
} 

[AttributeUsage(AttributeTargets.Property)]  
public class ColumnBindInt32Attribute: ColumnBindGenericAttribute<int> {} 

[ColumnBindInt32(ColumnName = "Category", DefaultValue = 100)] 
public int CategoryId { get; set; } 

當檢索的屬性,搜索查找兩種特定類型,以及基本類型,實際應用於成員的屬性。您可以檢索裝飾成員的所有ColumBindAttributes,即使它們是派生屬性。

編輯:

道歉。如果任何泛型類型直接或間接地從Attribute類型派生,則代碼將不會編譯。這使ColumnBindGenericAttribute類不可能。我認爲我在編譯器中發現了一個漏洞,結果比我更聰明。 :P