我被要求保留一些不像遗产一样的代码,并且它充满了编译器指令,使它几乎不可读,几乎可维护.例证:
#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.这个代码,如果它付给我.