以更灵活的方式使用属性修饰属性

本文关键字:属性 方式使 | 更新日期: 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]装饰IdOtherClass我可能想用[SomeCustomAttribute]装饰它。

有没有办法?

能够做这样的事情会很好:

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

以更灵活的方式使用属性修饰属性

属性是静态元数据。程序集、模块、类型、成员、参数和返回值不是 C# 中的一类对象(例如,System.Type 类只是类型的反射表示形式)。您可以获取类型的属性实例,并更改属性(如果它们是可写的),但这不会影响该属性,因为它应用于该类型

可以将

属性声明为 virtual,并在派生类中重写它。 使用特定于类的属性修饰重写,并使用应应用于所有类的任何属性修饰基属性。

确保应用于基属性的属性本身不是使用Inherited值为 falseAttributeUsageAttribute修饰的(默认值为 true )。 如果属性的AttributeUsage指定了Inherited == false则重写属性将不会继承该属性。 有关详细信息,请参阅文档。

无法将

属性修饰为单个对象实例级别的成员。它是特定于类型的元数据。如果你真的需要这个,你将不得不实现你自己的属性管理来处理特定于实例。