微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C#中删除预编译器指令

我被要求保留一些不像遗产一样的代码,并且它充满了编译器指令,使它几乎不可读,几乎可维护.例证:
#if CONDITION_1
        protected override void BeforeAdd(LogEntity entity)
#else
        protected override void BeforeAdd(AbstractBusinessEntity entity)
#endif
        {
#if CONDITON_1
            entity.DateTimeInsert = DateTime.Now;
#else
            ((LogEntity) entity).DateTimeInsert = DateTime.Now;
#endif
            base.BeforeAdd(entity);
        }

使用指令甚至更漂亮:

#if CONDITION_1
using CompanyName.Configuration;
#endif

#if CONDITION_2||CONDITION_1
using CompanyName.Data;
using CompanyName.Data.sqlBuilders;
#else
using CompanyName.Legacy.Database;
using CompanyName.Legacy.Database.sqlBuilders;
using CompanyName.Legacy.Database.sqlBuilders.parameterTypes;
#endif

我以为我会给ConditionalAttribute一个去,但在这种情况下这不会很有效

有什么方法可以解决这个编译器指令的噩梦吗?

代码是针对.NET 3.5编译的.

更新:
Oded回答建议删除BeforeAdd方法周围的编译器指令,从而使其重载.不幸的是,这两个方法都不会起作用,因为两个方法都应该覆盖一个AbstractBusiness类,它提供两种不同的实现,具体取决于最终包含哪些程序集:

protected virtual void BeforeAdd(TEntity entity) {}

要么

protected virtual void BeforeAdd(AbstractBusinessEntity entity) {}

代码从过去一段时间创建的一组库中获取其依赖关系,并且从那时起一直在“升级”.他们现在有4个不同版本的库,其中包含冲突的命名空间和不同的实现.所有这些都与使用(非常)旧版本的应用程序的“向后兼容性”有关.

结论

我最终选择了@Oded的答案,因为它作为一般方法最有意义(K.I.S.S.和所有这些).但是我不能在这种情况下使用它;你在这里看到的只是冰山一角.我不想要K.I.S.S.这个代码,如果它付给我.

解决方法

在第一种情况下,看起来您可以简单地使用该方法的多个重载而不是此构造.过载分辨率应该在这一点上处理.

在第二种情况下(使用指令) – 您可以使用所需的别名来为一些指令添加别名并包含所有指令.包含所有名称空间后会发生什么?有没有名字碰撞?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐