让我说我有这些课
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 ...
}
答案 0 :(得分:3)
属性是静态元数据。程序集,模块,类型,成员,参数和返回值不是C#中的第一类对象(例如,System.Type类仅仅是类型的反映表示)。您可以获取类型的属性实例,如果属性可写,则更改属性但不会影响属性,因为它应用于类型
答案 1 :(得分:2)
您可以将属性声明为virtual,并在派生类中覆盖它。使用特定于类的属性装饰覆盖,使用应该应用于所有类的任何属性装饰base属性。
确保应用于基本属性的属性本身不会使用AttributeUsageAttribute
Inherited
值false
(默认值为true
)进行修饰。如果属性AttributeUsage
指定Inherited == false
,则覆盖属性将不会继承该属性。有关详细信息,请参阅the documentation。
答案 2 :(得分:1)
无法为单个对象实例级别的成员修饰属性。它是特定类型的元数据。如果您真的需要这个,那么您必须实现自己的属性管理来处理特定于实例的。