当前位置: 首页 > 编程语言 > C#

删除C#中的预编译器指令Share

时间:2023-04-10 19:10:12 C#

RemovingPrecompilerDirectivesinC#示例:#ifCONDITION_1protectedoverridevoidBeforeAdd(LogEntityentity)#elseprotectedoverridevoidBeforeAdd(AbstractBusinessEntityentity)#endif{#ifCONDITON_1entity.DateTimeInsert=DateTime.Now;#else((LogEntity)实体).DateTimeInsert=DateTime。现在;#endifbase.BeforeAdd(实体);using指令甚至更漂亮:#ifCONDITION_1usingCompanyName.Configuration;#endif#ifCONDITION_2||CONDITION_1使用CompanyName.Data;使用CompanyName.Data.SqlBuilders;#else使用公司名称.Legacy.Database;使用CompanyName.Legacy.Database.SQLBuilders;使用CompanyName.Legacy.Database.SQLBuilders.parameterTypes;#endif我想我会给出一个ConditionalAttribute但在这种情况下它不起作用有什么办法可以解决这个pragma是一场噩梦吗?代码是针对.NET3.5编译的。更新:Oded的回答建议删除围绕BeforeAdd方法的编译器指令,从而使其重载。不幸的是,这两种方法都不起作用,因为它们都应该重写AbstractBusiness类,该类根据最终包含的程序集提供两种不同的实现:protectedvirtualvoidBeforeAdd(TEntityentity){}或protectedvirtualvoidBeforeAdd(AbstractBusinessEntity)entity){}此代码从前一段时间创建的一组库中获取其依赖项,并从那时起一直在“升级”。他们现在有4个不同版本的库,它们具有冲突的名称空间和不同的实现。所有这些都与使用(非常)旧版本的应用程序的“向后兼容性”有关。结论我最终选择了@Oded的回答,因为它作为一种通用方法(KISS等等)最有意义。在这种情况下我不能使用它;您在这里看到的只是冰山一角。如果它付给我钱,我不想透露这段代码。在第一种情况下,看起来您可能只是有一些方法重载而不是此构造。在这一点上,重载决议应该会处理好事情。在第二种情况下(使用指令)——您可以使用别名在需要的地方为某些指令添加别名,并包含所有指令。包含所有命名空间后会发生什么?有名称冲突吗?我声称问题不在这个类中。这个类只是一个症状。问题出在调用BeforeAdd的基类中。如果您可以在那里重构,那么您将不需要条件编译。如果您有名称和命名空间冲突,您可以使用using关键字(而不是程序集)来解决这个问题。因此,您可以使用LegacyLogEntity=Some.Fully.Qualified.Namespace.LogEntity;做一些事情;使用SomeOtherLogEntity=Some.Other.Fully.Qualified.Namespace.CurrentLogEntity;//..LegacyLogEntity实体=newLegacyLogEntity();我也觉得问题出在基类,不在这个类。在那种情况下,您可以通过使用适配或接口来解决这个问题。我不知道另一个类叫什么,但假设它叫做EntityAggregator。publicinterfaceIEntity{DateTimeInsertionTime{get;放;然后在你的聚合器基类中:protectedvirtualvoidBeforeAdd(IEntityentity){//whatever}然后在你的子类中:base.BeforeAdd(实体);您现在可以通过实现此接口使其他对象适应IEntity。当我看到这段代码时,我还以为您可能正在使用事件而不是这段代码。现在,如果您谈论的是多用途编译,即代码在两种不同条件下在两个不同位置进行编译,您可以使用部分类来更优雅地完成此操作。您将CONDITION_1代码隔离为如下所示://在文件WhateverYourClassIs.condition1.cs中#if!CONDITION_1#error此文件永远不应包含在没有CONDITION_1的构建中set#endifpublicpartialclassWhateverYourClassIs{protectedoverridevoidBeforeAdd(LogEntityentity){entity.DateTimeInsert=DateTime.Now;base.BeforeAdd(实体);}}//在文件中WhateverYourClassIs.NotCondition1.cs#ifCONDITION_1#error这个文件永远不应该包含在构建中WITHCONDITION_1set#endifpublicpartialclassWhateverYourClassIs{protectedoverridevoidBeforeAdd(AbstractBusinessEntityentity){((LogEntity)entity).DateTimeInsert=DateTime.Now;base.BeforeAdd(实体);我不喜欢这种情况,因为代码重复。您可以使用using关键字来帮助解决这个问题:#ifCONDITION_1usingMyAbstractBusinessEntity=LogEntity;#else使用MyAbstractBusinessEntity=AbstractBusinessEntity;#endif//...protectedoverridevoidBeforeAdd(MyAbstractBusinessEntityentity){//在CONDITION_1中,情况是无操作((LogEntity)entity).DateTimeInsert=DateTime.Now;base.BeforeAdd(实体);}就我所看到的,原来的开发者似乎没有任何继承和多态的意识。从代码中很难分辨,但LogEntity和AbstractBusinessEntity似乎共享共同的属性。是继承模型还是两个完全不相关的类?如果它们不相关,您是否可以创建它们都实现的继承模型或接口?如果您粘贴课程可能会有所帮助。长话短说,我不会浪费时间尝试使用当前形式的代码。我会不惜一切代价找到一种方法来消除编译器指令。它看起来并非完全无法恢复,但可能需要一些工作。我不知道它是否实用,但我会做的是在我的DVCSMercurial中创建一个分支来处理这个问题。我将使用两个分支,第三个临时分支用于修复错误/添加通用代码。这就是我创建初始版本的方式:5---6---7仅修复一个错误:5---6---7--11修复常见错误:5---6---7--11--13--15注意:这里假设你不会在任何类型或公共分支中进行大刀阔斧的重构,如果你这样做,你可能会更好地了解你当前的情况,在至少与分支相比,这样的事情。任何此类重构都会使未来的合并非常痛苦。以上为C#学习教程:删除C#中预编译指令共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注---本文收集自网络,不代表侵权,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: