.net 是否可以编写一个中断生成的自定义属性(如System.ObsoleteAttribute)?

.net 是否可以编写一个中断生成的自定义属性(如System.ObsoleteAttribute)?,.net,build,custom-attributes,.net,Build,Custom Attributes,我想创建一个自定义属性,该属性在构建过程中执行,可以根据一些逻辑中断构建,非常类似于System.obsoletateAttribute 例如,考虑下面的C代码(注意这是一个简化的例子): 此Check属性应检查其装饰的属性是否具有公共setter。由于MyProp属性没有公共setter(它有一个私有setter),因此Check属性应该会破坏构建 有可能吗?没有-至少,目前没有,使用标准构建工具。当“编译器即服务”项目发布时,完全可能会公开此功能。但是C#编译器实际上只改变了一些众所周知的属

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

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

Check
属性应检查其装饰的属性是否具有公共setter。由于
MyProp
属性没有公共setter(它有一个私有setter),因此
Check
属性应该会破坏构建


有可能吗?

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

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

  • 使用类似
  • 通过单元测试找到所有属性并进行检查

就我个人而言,我可能会选择后者。。。虽然实际上没有太多明显的好处-如果您记得以声明方式添加
[Check]
属性,您不记得添加公共setter吗?或者换一种方式说:如果你忘了使用公共setter,难道你不太可能忘记包含属性吗?

不幸的是,唯一可以链接到的C#spec版本是2003版本(其他版本的规范都是word格式)。它定义了一个概念。这些属性由编译器专门处理
ObsoleteAttribute
就是其中之一。@Damien\u不信者,谢谢你的参考,很高兴知道+1
Check
属性的作用不仅仅是检查。它有一些业务逻辑,如果属性缺少公共setter,则会失败(并导致无效的业务状态)。这就是动机…@Ron:对,这更有意义(也许值得在问题编辑中提及)。我坚持我的建议,编写一个测试来验证这一点——循环一个程序集中的所有类型和一个类型中的所有属性非常容易。
public class MyClass
{
    [Check]
    public int MyProp { get; private set; }
}