
Create an Attribute to Break the Build好的,从我之前的问题开始进行此类。 我真正想做的是创建某种属性,该属性使我可以装饰将破坏构建的方法。 与Obsolete(" reason",true)属性非常相似,但是没有错误地标识过时的代码。 需要说明的是:我不希望它在任何F6(构建)印刷机上中断构建,仅在代码中其他位置调用了用属性装饰的方法时才希望中断构建。 就像我说的那样,过时了,但是不一样。 我知道我并不孤单,因为其他用户出于其他原因希望使用它。 我以前从未创建过自定义属性,所以这对我来说是全新的!
我认为这对Microsoft来说是一个很好的功能要求:创建一个抽象基类属性 如果这是针对XML序列化和NHibernate的,那么您希望在其中访问无参构造函数(如您所引用的示例中的情况),则对序列化使用私有或受保护的无参构造函数,对于NHibernate使用受保护的构造函数。使用受保护的版本,您将可以使用继承的类来调用该代码。 如果您不希望代码调用方法,请不要使其可访问。 编辑:也许可以回答更深层次的问题,AFAIK编译器只知道三个属性:过时,条件和AttributeUsage。要为其他属性添加特殊处理,将需要修改编译器。 如果您考虑警告(这是[已过时]引发的)构建中断,则只需使用#warning编译器指令。 编辑:我从来没有使用过,但#error也可用。 我认为唯一可靠的方法是扩展Visual Studio(通过VSIP)并订阅正确的事件(可能在EnvDTE.BuildEvents中),并检查代码是否使用了构造函数,如果需要,则取消构建发现它。 回应4年后:) 我是否有过时的替代品也有同样的问题。 不久前,我回忆起(第9频道的视频)微软表示,它正在努力使开发人员在某个时候可以访问诸如编译器api之类的东西,因此将来可以设想编写一个编译器"插件"以允许用自己的自定义属性修饰方法,并告诉编译器取消修饰的代码是否可以在代码中的其他位置调用等。 考虑一下,这实际上会很酷。这也提醒我,我也应该尝试阅读MS正在处理的编译器api的进度。 在构建后步骤中抛出自定义异常并对其进行单元测试 创建一个FxCop规则,并将FxCop添加到您的集成版本中以进行检查。 您会得到警告,而不是失败的构建。属性在反射时间而不是构建时间"运行"。 另外(这很讨厌)将编译器指令放在您不想被调用的方法周围。然后,如果您调用它,则代码将中断,但是您可以设置一个通过正确的编译器指令而不会通过的编译。 我建议您使用#error指令。 另一个可能起作用的未知属性是条件属性(取决于您要努力实现的目标)
如果定义了" MY_CONDITION",它将从IL代码本身中删除方法调用。 我将不得不同意Greg:为其补充一个属性。 如果您真的很认真,也许可以找到一种方法来弄清楚是否正在使用XMLSerializer以外的任何方法访问构造函数,如果抛出异常,则抛出异常。 听起来有点像昨天的TDWTF。 :-) 为什么不只是化妆呢?未知属性肯定会破坏构建。
|