c# - 摆脱 C# 中的预编译器指令

标签 c# .net-3.5 c#-3.0 compiler-directives

我被要求维护一些不像我想要的那样遗留的代码,它充满了编译器指令,使它几乎不可读但几乎可以维护。恰当的例子:

#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 个不同版本,它们具有冲突的 namespace 和不同的实现。所有这些都是为了与使用(非常)旧版本的应用程序“向后兼容”。


结论

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

最佳答案

在第一种情况下,看起来您可以简单地重载多个方法而不是此构造。过载解析应该处理此时的事情。

在第二种情况下(使用指令)——你可以为一些指令起别名并包含所有指令,在需要的地方使用别名。当包含所有 namespace 时会发生什么?有没有名称冲突?

关于c# - 摆脱 C# 中的预编译器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5353755/

相关文章:

c# - 使用 iOS 加密;使用 .Net 解密

c# - 使用带有泛型类的 ContextBuilder 使用 Entity Framework 4 创建 EDMX/DB-Schema 的异常

c# - C# 中两个几乎相同的 Web 引用的接口(interface)

c# - 绑定(bind)列表和 LINQ?

asp.net - 通用格式的最佳 PDF 转换器

c# - 无法显示 VS 2012 设计器

c# - 使用 JavaScript 将参数传递给代码隐藏函数

c# - 包含带有计时器的对象的字典。需要找出哪个对象的计时器正在调用 elapsed 事件

c# - .NET 2.0 应用程序可以使用 .NET 3.5 的哪些功能?

c# 如何链接 2 LinkedListNode?