是否有属性来限制自定义属性可以应用的类型?

时间:2011-02-25 04:33:17

标签: .net attributes types

我正在写一个当前有

的属性(它是一个ValidatorAttribute)
[AttributeUsage(AttributeTargets.Property)]

它限制了可以放置属性的构造的类型。它可以应用于可能存在的任何属性。

我想知道是否有一个属性会限制可以应用该属性的属性的Type。我想限制它在DateTime属性上使用。

我可以看到几个选项,但它们并不理想:

  • 我可以通过检查属性中的类型来忽略属性的实例,但是没有迹象表明开发人员该属性没有做任何事情
  • 如果Type不正确,我可以抛出异常,但由于显而易见的原因,这只是一个坏主意。

理想情况下,我会收到编译时错误,类似于我将此属性放在除属性之外的任何内容时:

  

属性对此无效   声明类型。它只对有效   'property,indexer'声明。

我不认为有这样的属性,但我很高兴出错。或者,是否有人写过这样的属性(甚至可能?),或任何建议的替代方案?

2 个答案:

答案 0 :(得分:2)

强制执行此操作的唯一方法是编写一个后构建工具,该工具枚举程序集中的所有类型,并验证是否将其应用于正确的类型。这样做没有太大意义,如果应用错误,属性就不会产生任何影响,你只是找不到它。

答案 1 :(得分:0)

可以做@Hans Passant建议的工具之一是:http://www.postsharp.net/另一个选择是使用像Boo这样的语言,这是一种支持Abstract Syntax Tree的.NET运行时兼容语言操纵为part of the compile chain。这将允许创建一个将在编译时执行的宏,该宏将进行适当的类型检查。