删除C#中的预处理器分支

时间:2014-08-10 09:34:47

标签: c# c-preprocessor

我正在重构一些源代码并完成了删除预处理器编译的任务。我现在已经在互联网上搜索了几天,但是没有找到任何好主意如何做到这一点。我对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.....
}

那么删除预处理器编译的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

几个月前我遇到过类似的任务:大型C#代码库和广泛的预处理器指令用法。手动重构在那里看起来像一个长期无聊的猴子工作。 我使用 unifdef sunifdef coan C工具失败了,因为像#region和其他一些C#语法细节。从长远来看,我已经制作了自己的工具undefine。它使用regexp来解析预处理器指令和sympy python库以简化逻辑表达式。它在大型10M线代码库上对我有用。

答案 1 :(得分:0)

据我所知,这三种设备类型没有公共基类或接口。您不能在运行时选择三个中的一个,并使用基本类型键入所有变量。

以下是一些选项:

  1. 找到一种公共基本类型的方法。
  2. 如果您无法修改类(或由于某种原因它不合适),请编写包装器。该包装器可以具有您喜欢的任何结构。每个设备类可以有一个包含公共基类型的包装器。
  3. 使用 dynamic 。这可以快速修复,但代价是减少工具帮助(更少的自动完成,更少的文档,更少的静态错误检查)。
  4. 使用#if解决此问题非常不寻常。这是有问题的,因为甚至确保代码编译的测试量现在已经增加了两倍。您还需要多个二进制文件。