你能创建一个功能类似的自定义属性吗?

时间:2017-06-19 14:36:11

标签: c# asp.net asp.net-mvc

假设您在模型中有一个如下所示的属性:

[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime CreationDate { get; set; }

你可以这样做:

[ComboAttribute] // Does the same thing as the two attributes above
public DateTime CreationDate { get; set; }

我正在探索确保我的所有DateTime属性具有相同的4到5个属性的方法。如果我必须添加或更改属性,目前我必须使用Ctrl + F并确保我获得每个实例,这只是在寻找麻烦。

这可能吗?有没有更好的方法来获得我正在寻找的防错功能?

2 个答案:

答案 0 :(得分:1)

属性是附加类型或成员定义的数据结构。在运行时,组件可以使用反射API来查找已应用于类型或成员的属性,并相应地调整其行为。

了解属性本身不做任何事情非常重要。总是必须有一段代码来查找该特定属性。如果定义新属性,除非查找与特定约定匹配的属性或从特殊基类型继承,否则代码将找不到它。 您需要了解寻找属性的代码,以了解您是否可以创建自己的属性。

对于创建属性聚合的特定任务,唯一可行的是预处理器(例如PostSharp),它可以获取您的自定义属性并逐字地重写代码,就像您把那两个属性放在那里。

如果您确实沿着PostSharp路线前进,那么可以使用自定义属性生成属性示例:How to inject an attribute using a PostSharp attribute?

答案 1 :(得分:-1)

这里有两个问题:第一,你的属性将被期望的任何框架查找(例如MVC期望属性的某些属性)。第二,你的属性将执行所有属性的逻辑组合。

对于第一个问题,您的属性必须从已知的基本属性(如ValidationAttribute)继承,或实现已知的接口,如IActionFilter,具体取决于您要替换的属性。

对于第二个问题,您的属性可以实例化它正在替换的每个属性的实例,并将其继承/实现的功能委托给相应的属性实例。