假设您在模型中有一个如下所示的属性:
[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
并确保我获得每个实例,这只是在寻找麻烦。
这可能吗?有没有更好的方法来获得我正在寻找的防错功能?
答案 0 :(得分:1)
属性是附加类型或成员定义的数据结构。在运行时,组件可以使用反射API来查找已应用于类型或成员的属性,并相应地调整其行为。
了解属性本身不做任何事情非常重要。总是必须有一段代码来查找该特定属性。如果定义新属性,除非查找与特定约定匹配的属性或从特殊基类型继承,否则代码将找不到它。 您需要了解寻找属性的代码,以了解您是否可以创建自己的属性。
对于创建属性聚合的特定任务,唯一可行的是预处理器(例如PostSharp),它可以获取您的自定义属性并逐字地重写代码,就像您把那两个属性放在那里。
如果您确实沿着PostSharp路线前进,那么可以使用自定义属性生成属性示例:How to inject an attribute using a PostSharp attribute?
答案 1 :(得分:-1)
这里有两个问题:第一,你的属性将被期望的任何框架查找(例如MVC期望属性的某些属性)。第二,你的属性将执行所有属性的逻辑组合。
对于第一个问题,您的属性必须从已知的基本属性(如ValidationAttribute
)继承,或实现已知的接口,如IActionFilter
,具体取决于您要替换的属性。
对于第二个问题,您的属性可以实例化它正在替换的每个属性的实例,并将其继承/实现的功能委托给相应的属性实例。