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 ...
}
4

3 回答 3

3

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

于 2012-04-19T19:27:22.780 回答
2

您可以将该属性声明为虚拟属性,并在派生类中覆盖它。使用特定于类的属性来装饰覆盖,并使用应该应用于所有类的任何属性来装饰基本属性。

确保应用于基本属性的属性本身没有AttributeUsageAttributeInheritedfalse(默认值为true)修饰。如果AttributeUsage指定了属性Inherited == false,则覆盖属性将不会继承该属性。有关更多信息,请参阅文档

于 2012-04-19T19:33:28.707 回答
1

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

于 2012-04-19T19:32:35.807 回答