以更灵活的方式使用属性修饰属性
本文关键字:属性 方式使 | 更新日期: 2023-09-27 18:31:37
假设我有这些类
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
我可能想用[Required]
装饰Id
,OtherClass
我可能想用[SomeCustomAttribute]
装饰它。
有没有办法?
能够做这样的事情会很好:
public class SomeClass : BaseClass
{
public SomeClass()
{
WithProperty(x => x.Id).AddAttribute(new RequiredAttribute());
...
}
... more properties ...
}
属性是静态元数据。程序集、模块、类型、成员、参数和返回值不是 C# 中的一类对象(例如,System.Type 类只是类型的反射表示形式)。您可以获取类型的属性实例,并更改属性(如果它们是可写的),但这不会影响该属性,因为它应用于该类型
可以将
属性声明为 virtual,并在派生类中重写它。 使用特定于类的属性修饰重写,并使用应应用于所有类的任何属性修饰基属性。
确保应用于基属性的属性本身不是使用Inherited
值为 false
的AttributeUsageAttribute
修饰的(默认值为 true
)。 如果属性的AttributeUsage
指定了Inherited == false
则重写属性将不会继承该属性。 有关详细信息,请参阅文档。
无法将
属性修饰为单个对象实例级别的成员。它是特定于类型的元数据。如果你真的需要这个,你将不得不实现你自己的属性管理来处理特定于实例。