【问题标题】:Decorate properties with attributes in a more flexible manner以更灵活的方式用属性装饰属性
【发布时间】:2012-04-19 19:25:47
【问题描述】:

假设我有这些课程

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# .net asp.net-mvc asp.net-mvc-3 custom-attributes


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-10
          • 2020-06-20
          • 2019-07-29
          • 2014-06-25
          • 2011-01-25
          相关资源
          最近更新 更多