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

时间:2012-04-19 19:25:47

标签: c# .net asp.net-mvc asp.net-mvc-3 custom-attributes

让我说我有这些课

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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

确保应用于基本属性的属性本身不会使用AttributeUsageAttribute Inheritedfalse(默认值为true)进行修饰。如果属性AttributeUsage指定Inherited == false,则覆盖属性将不会继承该属性。有关详细信息,请参阅the documentation

答案 2 :(得分:1)

无法为单个对象实例级别的成员修饰属性。它是特定类型的元数据。如果您真的需要这个,那么您必须实现自己的属性管理来处理特定于实例的。