创建一个属性以破坏构建
好的,这种情况是从我之前的问题开始的。
我真正想做的是创建某种属性,该属性使我可以装饰将破坏构建的方法。与Obsolete(" reason",true)属性非常相似,但没有错误地标识过时的代码。
需要说明的是:我不希望它在任何F6(构建)印刷机上中断构建,仅在代码中其他地方调用了用属性装饰的方法时才希望中断构建。就像我说的一样,已经过时了,但是不一样。
我知道我并不孤单,因为其他用户出于其他原因希望使用它。我以前从未创建过自定义属性,所以这对我来说是全新的!
解决方案
回答
听起来似乎有点像昨天的TDWTF。 :-)
回答
如果我们考虑警告(这是[已过时]引发的)构建中断,则只需使用#warning编译器指令。
编辑:我从未使用过,但#error也可用。
回答
为什么不只是化妆呢?未知属性肯定会破坏构建。
[MyMadeUpAttributeThatBreaksTheBuildForSure] public class NotDoneYet {}
回答
我将不得不同意Greg:为其补充一个属性。
如果我们真的很认真,也许可以找到一种方法来弄清楚是否正在使用XMLSerializer以外的任何方法访问构造函数,如果抛出异常,则抛出异常。
回答
如果这是针对XML序列化和NHibernate的,我们希望在这里访问无参构造函数(如我们所引用的示例中的情况),则对序列化使用私有或者受保护的无参构造函数,对于NHibernate使用受保护的构造函数。使用受保护的版本,我们将可以使用继承的类来调用该代码。
如果我们不希望代码调用方法,请不要使其可访问。
编辑:也许可以回答更深层次的问题,AFAIK编译器只知道三个属性:过时,条件和AttributeUsage。要为其他属性添加特殊处理,将需要修改编译器。
回答
我建议我们使用#error指令。
另一个可能起作用的未知属性是条件属性(取决于我们要努力实现的目标)
[Conditional("CONDITION")] public static void MiMethod(int a, string msg)
如果定义了" MY_CONDITION",它将从IL代码本身中删除方法调用。
回答
创建一个FxCop规则,并将FxCop添加到集成版本中以进行检查。
我们会得到警告,而不是失败的构建。属性在反射时间而不是构建时间"运行"。
另外(这很讨厌)将编译器指令放在我们不想被调用的方法周围。然后,如果我们调用它,则代码将中断,但是我们可以设置一个通过正确的编译器指令但不通过的编译器。
回答
我认为唯一可靠的方法是扩展Visual Studio(通过VSIP)并订阅正确的事件(可能在EnvDTE.BuildEvents中),并检查代码是否使用了构造函数,如果我们取消构建,则检测到它。
回答
我认为这对Microsoft来说是一个很好的功能要求:创建一个抽象基类属性CompilerExecutedAttribute,该属性可以由编译器以某种方式处理或者可能影响编译过程。然后我们可以继承此属性并实现不同的操作,例如发出错误或者警告。