gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:14:41 25 4
gpt4 key购买 nike

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

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com