【问题标题】:Is it possible to code a Custom Attribute that breaks a build (like System.ObsoleteAttribute)?是否可以编写破坏构建的自定义属性(如 System.ObsoleteAttribute)?
【发布时间】:2011-08-17 08:00:48
【问题描述】:

我想创建一个在构建过程中执行的自定义属性,它可以根据一些逻辑中断构建,非常类似于System.ObsoleteAttribute

例如,考虑以下 C# 代码(注意这是一个简化的示例):

public class MyClass
{
    [Check]
    public int MyProp { get; private set; }
}

这个Check 属性应该检查它装饰的属性是否有一个公共设置器。由于MyProp 属性没有公共设置器(它有一个私有设置器),Check 属性应该会破坏构建。

有可能吗?

【问题讨论】:

  • 不幸的是,唯一可以链接到的 C# 规范版本是 2003 版(其他版本的规范是 word 格式)。它定义了"Reserved Attributes" 的概念。这些属性由编译器专门处理。 ObsoleteAttribute 就是其中之一。
  • @Damien_The_Unbeliever,感谢您的参考,很高兴知道! +1

标签: .net build custom-attributes


【解决方案1】:

没有 - 至少,目前没有,使用标准构建工具。当“编译器即服务”项目发布时,这完全有可能公开此功能。但 C# 编译器真正改变其行为的只是一些众所周知的属性。

您可能需要考虑的两个选项:

  • 使用PostSharp 之类的东西进行后处理
  • 单元测试以查找所有属性并以这种方式检查它们

就我个人而言,我可能会选择后者...虽然确实没有太多明显的好处 - 如果您记得以声明方式添加 [Check] 属性,您不会记得添加公共设置器吗?或者换一种说法:如果你忘记使用 public setter,你是不是也很可能忘记包含属性?

【讨论】:

  • Check 属性不仅仅是检查。它有一些业务逻辑,如果属性缺少公共设置器,则会失败(并导致无效的业务状态)。这就是动机……
  • @Ron:是的,这更有意义(也许值得在问题编辑中提及)。我坚持编写测试来验证这一点的建议 - 循环遍历程序集中的所有类型和类型中的所有属性很容易。
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 2020-02-21
  • 2016-07-20
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多