代码之家  ›  专栏  ›  技术社区  ›  Rob Cooper

创建属性以中断生成

  •  8
  • Rob Cooper  · 技术社区  · 17 年前

    好吧,这是从 my previous question .

    我真正想做的是创建某种属性,它允许我修饰一个方法, 打破建筑 . 很像 过时(“原因”,正确) 属性,但不能错误地标识过时的代码。

    澄清 :我不希望它破坏这个基础 任何 按F6(build)键,我只希望它在代码中的其他地方调用用属性修饰的方法时中断构建。就像我说的, 类似的 过时,但不一样。

    我知道我并不孤单,因为 other users want to use it for other reasons . 我以前从未创建过自定义属性,所以它对我来说是全新的!

    11 回复  |  直到 13 年前
        1
  •  4
  •   Community Mohan Dere    8 年前

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

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

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

        2
  •  5
  •   Konrad Rudolph    17 年前

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

        3
  •  3
  •   Tom Mayfield    17 年前

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

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

        4
  •  1
  •   Vaibhav    17 年前

    我认为唯一简单的方法是扩展Visual Studio(通过VSIP)并订阅正确的事件(可能在envdte.buildEvents)类,检查代码中构造函数的用法,如果检测到,则取消生成。

        5
  •  0
  •   Ross    17 年前

    这一切听起来都有点像 Yesterday's TDWTF . -)

        6
  •  0
  •   Jon Limjap    17 年前

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

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

        7
  •  0
  •   Jorge Córdoba    17 年前

    我建议您使用错误指令。

    另一个可能完成这项工作的未知属性是 conditional attribute (取决于你想做什么)

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

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

        8
  •  0
  •   Keith    17 年前

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

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

    或者(这相当糟糕)在不想被调用的方法周围放置一个编译器指令。然后,如果调用它,代码就会中断,但是您可以设置一个通过正确编译器指令而不通过的构建。

        9
  •  0
  •   ChrisFletcher    13 年前

    作为后期生成步骤引发自定义异常并对其进行单元测试

        10
  •  0
  •   Dean Lunz    13 年前

    4年后回复:)

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

    据我回忆(Channel9视频)不久前,微软说它正在努力让开发者在某个时候访问类似编译器API的东西,所以将来你可以编写一个编译器“插件”,它允许用你自己的自定义属性修饰方法,并告诉编译器如果它看起来像比如装饰代码可以在代码中的其他地方调用。

    当你想到这件事的时候,会觉得很酷。它还提醒我,我还应该试着读一读微软正在研究的编译器API的进展…

        11
  •  -1
  •   Greg Hurlman    17 年前

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

    [MyMadeUpAttributeThatBreaksTheBuildForSure]
    public class NotDoneYet {}
    
    推荐文章