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