创建一个属性来打破构建

时间:2008-08-26 14:15:08

标签: .net attributes

好的,这种关注来自my previous question

我真正想要做的是创建一些属性,允许我装饰一个打破构建的方法。与过时(“原因”,真实)属性非常相似,但不会错误地识别过时的代码。

澄清:我不希望它打破 ANY F6(Build)按下的构建,我只希望它打破构建如果一个方法用属性在代码中的其他位置调用。就像我说的那样,类似已经过时,但不一样。

我知道我并不孤单,因为other users want to use it for other reasons。我之前从未创建过自定义属性,因此对我来说都是新手!

11 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

如果这是用于XML序列化和NHibernate,您希望无参数构造函数可以访问(如您引用的example中的情况),那么使用私有或受保护的无参数构造函数进行序列化,或者NHibernate的受保护构造函数。使用受保护的版本,您可以自己打开能够调用该代码的继承类。

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

编辑:或许回答更深层次的问题,AFAIK编译器只知道三个属性:Obsolete, Conditional, and AttributeUsage。要为其他属性添加特殊处理,需要修改编译器。

答案 2 :(得分:3)

如果您考虑一个警告(这是[Obsolete]抛出的)构建破坏,那么只需使用#warning编译器指令。

编辑:我从未使用过它,但#error也可用。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这一切都开始有点像Yesterday's TDWTF。 : - )

答案 5 :(得分:0)

我将不得不同意格雷格:为它制定一个属性。

如果你真的很认真,也许可以找到一种方法来判断构造函数是否被XMLSerializer以外的任何东西访问,如果是,则抛出异常。

答案 6 :(得分:0)

我建议你使用#error指令。

可能完成这项工作的另一个非常未知的属性是conditional attribute(取决于你想要尝试的东西)

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

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

答案 7 :(得分:0)

创建一个FxCop规则,并将FxCop添加到您的集成构建中,以便检查这一点。

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

或者(这是相当讨厌的)在你不想被调用的方法周围放置一个编译器指令。如果你调用它,你的代码就会中断,但你可以设置一个传递正确的编译器指令的构建,但不会。

答案 8 :(得分:0)

为后续构建步骤抛出自定义异常和单元测试

答案 9 :(得分:0)

4年后回复:)

我有同样的问题,如果有替代Obsolete。

从我记得(频道9视频)不久前微软声称它正在努力让开发人员在某些时候访问类似编译器api的东西,所以将来可以想象你可以写一个编译器“插件”将允许使用您自己的自定义属性修饰方法,并告诉编译器取消,如果看起来装饰的代码可能被调用在代码中的其他位置等。

当你想到它时,这真的很酷。它还提醒我,我也应该尝试阅读MS正在开发的编译器api的进展......

答案 10 :(得分:-1)

为什么不做点什么呢?一个未知的属性肯定会破坏构建。

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}