2012-04-19 64 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