我正在重构一些源代码并完成了删除预处理器编译的任务。我现在已经在互联网上搜索了几天,但是没有找到任何好主意如何做到这一点。我对C#也很陌生。
所以问题出现了,我为每个设备提供了不同的接口(类)和#34; ControlLogic" class当时只需要使用其中一个。在程序运行时选择设备。 到目前为止" device"变量(也用于全局)在很多地方使用,并考虑对我没有意义的重命名。此外,所有设备接口(类)都是从基类派生的,但接口类确实为它们实现了不同的方法。
public class ControlLogic
{
#if FIRST_DEVICE
public FirstDeviceInterace device = null;
#elif SECOND_DEVICE
public SecondDeviceInterface device = null;
#elif THIRD_DEVICE
public ThirdDeviceInterface device = null;
#endif
// One example method
public void startDevice()
{
if (device != null)
{
#if (FIRST_DEVICE || SECOND_DEVICE)
device.startDevice();
#endif
#if THIRD_DEVICE
device.startThirdDevice();
#endif
}
}
// More code.....
}
那么删除预处理器编译的最佳方法是什么?
答案 0 :(得分:1)
几个月前我遇到过类似的任务:大型C#代码库和广泛的预处理器指令用法。手动重构在那里看起来像一个长期无聊的猴子工作。 我使用 unifdef , sunifdef 和 coan C工具失败了,因为像#region和其他一些C#语法细节。从长远来看,我已经制作了自己的工具undefine。它使用regexp来解析预处理器指令和sympy python库以简化逻辑表达式。它在大型10M线代码库上对我有用。
答案 1 :(得分:0)
据我所知,这三种设备类型没有公共基类或接口。您不能在运行时选择三个中的一个,并使用基本类型键入所有变量。
以下是一些选项:
dynamic
。这可以快速修复,但代价是减少工具帮助(更少的自动完成,更少的文档,更少的静态错误检查)。使用#if
解决此问题非常不寻常。这是有问题的,因为甚至确保代码编译的测试量现在已经增加了两倍。您还需要多个二进制文件。