关于.net:创建属性以破坏构建

关于.net:创建属性以破坏构建

Create an Attribute to Break the Build

好的,从我之前的问题开始进行此类。

我真正想做的是创建某种属性,该属性使我可以装饰将破坏构建的方法。 与Obsolete(" reason",true)属性非常相似,但是没有错误地标识过时的代码。

需要说明的是:我不希望它在任何F6(构建)印刷机上中断构建,仅在代码中其他位置调用了用属性装饰的方法时才希望中断构建。 就像我说的那样,过时了,但是不一样。

我知道我并不孤单,因为其他用户出于其他原因希望使用它。 我以前从未创建过自定义属性,所以这对我来说是全新的!


我认为这对Microsoft来说是一个很好的功能要求:创建一个抽象基类属性CompilerExecutedAttribute,该属性可以由编译器以某种方式处理,或者可以影响编译过程。然后我们可以从该属性继承并实现不同的操作,例如发出错误或警告。


如果这是针对XML序列化和NHibernate的,那么您希望在其中访问无参构造函数(如您所引用的示例中的情况),则对序列化使用私有或受保护的无参构造函数,对于NHibernate使用受保护的构造函数。使用受保护的版本,您将可以使用继承的类来调用该代码。

如果您不希望代码调用方法,请不要使其可访问。

编辑:也许可以回答更深层次的问题,AFAIK编译器只知道三个属性:过时,条件和AttributeUsage。要为其他属性添加特殊处理,将需要修改编译器。


如果您考虑警告(这是[已过时]引发的)构建中断,则只需使用#warning编译器指令。

编辑:我从来没有使用过,但#error也可用。


我认为唯一可靠的方法是扩展Visual Studio(通过VSIP)并订阅正确的事件(可能在EnvDTE.BuildEvents中),并检查代码是否使用了构造函数,如果需要,则取消构建发现它。


回应4年后:)

我是否有过时的替代品也有同样的问题。

不久前,我回忆起(第9频道的视频)微软表示,它正在努力使开发人员在某个时候可以访问诸如编译器api之类的东西,因此将来可以设想编写一个编译器"插件"以允许用自己的自定义属性修饰方法,并告诉编译器取消修饰的代码是否可以在代码中的其他位置调用等。

考虑一下,这实际上会很酷。这也提醒我,我也应该尝试阅读MS正在处理的编译器api的进度。


在构建后步骤中抛出自定义异常并对其进行单元测试


创建一个FxCop规则,并将FxCop添加到您的集成版本中以进行检查。

您会得到警告,而不是失败的构建。属性在反射时间而不是构建时间"运行"。

另外(这很讨厌)将编译器指令放在您不想被调用的方法周围。然后,如果您调用它,则代码将中断,但是您可以设置一个通过正确的编译器指令而不会通过的编译。


我建议您使用#error指令。

另一个可能起作用的未知属性是条件属性(取决于您要努力实现的目标)

1
2
[Conditional("CONDITION")]
public static void MiMethod(int a, string msg)

如果定义了" MY_CONDITION",它将从IL代码本身中删除方法调用。


我将不得不同意Greg:为其补充一个属性。

如果您真的很认真,也许可以找到一种方法来弄清楚是否正在使用XMLSerializer以外的任何方法访问构造函数,如果抛出异常,则抛出异常。


听起来有点像昨天的TDWTF。 :-)


为什么不只是化妆呢?未知属性肯定会破坏构建。

1
2
[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}


推荐阅读