好的,这种延续自 我之前的问题.

我真正想做的是创建某种属性,它允许我装饰一个方法,该方法将 打破构建. 。很像 已过时(“原因”,true) 属性,但不会错误地识别过时的代码。

澄清: :我不想让它破坏构建 任何 按 F6(构建),我只希望它在代码中的其他地方调用用该属性修饰的方法时破坏构建。就像我说的, 相似的 过时,但不一样。

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

有帮助吗?

解决方案

如果这是用于 XML 序列化和 NHibernate,您希望无参数构造函数可访问(如 例子 您引用的),然后使用私有或受保护的无参数构造函数进行序列化,或使用 NHibernate 的受保护构造函数。使用受保护的版本,您可以让继承的类能够调用该代码。

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

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

其他提示

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

如果您认为警告(这就是 [Obsolete] 抛出的内容)会破坏构建,那么只需使用 #警告 编译器指令。

编辑:我从来没有用过它,但是 #错误 也可用。

我认为唯一万无一失的方法是扩展 Visual Studio(通过 VSIP)并订阅正确的事件(可能在 EnvDTE.BuildEvents 中)类,并检查代码以了解构造函数的使用情况,如果您这样做,则取消构建检测它。

这一切听起来有点像 昨天的TDWTF. :-)

我必须同意格雷格的观点:为它补一个属性。

如果您真的很认真,也许可以找到一种方法来确定构造函数是否被 XMLSerializer 之外的任何其他对象访问,如果是,则抛出异常。

我建议您使用#error指令。

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

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

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

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

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

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

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

4年后回复:)

我有同样的问题是否有替代过时的方法。

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

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

为什么不编点东西呢?未知的属性肯定会破坏构建。

[MyMadeUpAttributeThatBreaksTheBuildForSure]
public class NotDoneYet {}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top