2012-04-19 82 views
1

屬性裝飾性能可以說我有這些類以更靈活的方式

public class BaseClass 
{ 
    public int Id { get; set; } 
} 

public class SomeClass : BaseClass 
{ 
    ... more properties ... 
} 

BaseClass的被認爲是在很多地方使用。

對我來說,我使用ASP.NET MVC 3的EditorForModel渲染視圖,這是常見的裝飾與屬性,如[Display(Name = "Id"), Required]

屬性,但可以說,我會想裝飾的BaseClass的不同屬性每個繼承它的類的方法。在SomeClass我可能想裝飾Id[Required]OtherClass我可能想用[SomeCustomAttribute]裝飾它。

有沒有辦法呢?

這將是很好能夠做這樣的事情:

public class SomeClass : BaseClass 
{ 
    public SomeClass() 
    { 
    WithProperty(x => x.Id).AddAttribute(new RequiredAttribute()); 
    ... 
    } 

    ... more properties ... 
} 

回答

3

屬性是靜態的元數據。程序集,模塊,類型,成員,參數和返回值不是C#中的第一類對象(例如,System.Type類僅僅是類型的反映表示)。您可以獲取某個類型的屬性實例,並在屬性爲可寫時更改屬性,但不會影響該屬性,因爲它適用於類型

1

無法將屬性修飾爲成員個別對象實例級別。它是類型特定的元數據。如果你真的需要這個,你將不得不實現你自己的屬性管理來處理特定於實例。

2

您可以聲明該屬性爲虛擬的,並在派生類中重寫該屬性。使用特定於類的屬性裝飾覆蓋,並使用應該應用於所有類的任何屬性來裝飾基本屬性。

確保施加到基本屬性的屬性本身不是裝飾的AttributeUsageAttributefalse一個Inherited值(默認值是true)。如果屬性的AttributeUsage指定Inherited == false那麼重寫屬性將不會繼承該屬性。有關更多信息,請參閱the documentation