有没有理由不使用CustomAttributes?

时间:2009-10-06 21:03:11

标签: c# .net custom-attributes codesmith

如果有理由我走这条路,这主要是征求意见。

我有一个多层的CodeSmith生成的应用程序。在UI级别,需要一些所需的字段,并且必需的字段将根据绑定实体中的字段值而变化。我正在考虑做的是为实体中的每个属性添加一个“PropertyRequired”CustomAttribute,当我在其管理器中加载实体时,我可以设置为true或false。然后我将使用Reflection查询属性并在UI级别向用户提供可视反馈,并且我可以在保存之前验证所有必需属性在管理器中是否具有有效值。我已经把它作为概念证明,在一个实体中有一个属性,但在我尝试将其扩展到应用程序的其余部分之前,我想问一下是否有更多经验的人要么告诉我去为了它,或者为什么我在扩大规模时不喜欢它。如果这是一个坏主意,或者你可以提出更好的方法,请提出你的意见。

3 个答案:

答案 0 :(得分:3)

这是一种非常合理的方式(之前我做过非常相似的事情) - 但总是缺点:

  • 任何需要该实体的代码都需要额外的引用(假设属性和实体位于不同的程序集中)
  • 必须在编译时确定值(除非你很聪明)
  • 您无法在控件以外的实体上使用

在大多数情况下,以上都不是问题。如果他们 是一个问题,您可能希望支持外部元数据模型 - 但除非您需要它,否则这将是过度的。除非你必须这样做,否则不要这样做(意思是:继续使用属性;它们通常很好)。

答案 1 :(得分:1)

没有内在的理由来避免自定义属性。它是受支持的CLR功能,是许多可用产品的主干(Code Contracts,FxCop等......)。

答案 2 :(得分:0)

这不是一种不合理的方法,而且比将这些内容烘焙到UI层更健康。在进行全程潜水之前,有几点值得考虑:

  • 您正在将业务逻辑与业务实体本身紧密结合。是否存在需要字段或有效值可能发生变化的情况?您可能会限制自己或面对不一致的验证机制
  • 动态分配是可能的,但更棘手 - 即当您设置要求的字段时,除非您覆盖
  • 如果你想要做更复杂的事情,那么自定义属性可能非常不灵活 - 即如果你需要将状态传递给属性驱动的验证方案。属性,如声明性赋值。只有具有真/假所需属性不应该是这里的问题

真的只是一个魔鬼的拥护者,一般来说,一个相当简单的应用程序,你只关心必需的字段,这是一个非常整洁的方式