好的,这种关注来自my previous question。
我真正想要做的是创建一些属性,允许我装饰一个打破构建的方法。与过时(“原因”,真实)属性非常相似,但不会错误地识别过时的代码。
澄清:我不希望它打破 ANY F6(Build)按下的构建,我只希望它打破构建如果一个方法用属性在代码中的其他位置调用。就像我说的那样,类似已经过时,但不一样。
我知道我并不孤单,因为other users want to use it for other reasons。我之前从未创建过自定义属性,因此对我来说都是新手!
答案 0 :(得分:5)
我认为这对于Microsoft来说是一个很好的功能请求:创建一个抽象基类属性CompilerExecutedAttribute
,编译器以某种方式处理或者可以影响编译过程。然后我们可以继承这个属性并实现不同的操作,例如发出错误或警告。
答案 1 :(得分:4)
如果这是用于XML序列化和NHibernate,您希望无参数构造函数可以访问(如您引用的example中的情况),那么使用私有或受保护的无参数构造函数进行序列化,或者NHibernate的受保护构造函数。使用受保护的版本,您可以自己打开能够调用该代码的继承类。
如果您不希望代码调用方法,请不要使其可访问。
编辑:或许回答更深层次的问题,AFAIK编译器只知道三个属性:Obsolete, Conditional, and AttributeUsage。要为其他属性添加特殊处理,需要修改编译器。
答案 2 :(得分:3)
答案 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 {}