可以在static / const成员上使用处理器#if吗?

时间:2015-02-07 11:35:35

标签: c#

我的项目中有一个包含全局配置的类,如下所示:

public class Config {
    public const bool LOGGING_ENABLED = false;
}

我希望能够使用该成员编写预处理程序指令,如下所示:

#if LOGGING_ENABLED
    [Logging]
    public class MyClass: ContextBoundObject
#else
    public class MyClass
#endif
    {
        ...
    }

但显然,LOGGING_ENABLED将是未定义的,因为它实际上并不引用Config.LOGGING_ENABLED。有没有办法在另一个类中引用常量成员?我不想将#define LOGGING_ENABLED放在每个类文件的顶部,这会破坏整个目的。

3 个答案:

答案 0 :(得分:2)

这是不可能的。 C#预处理器是C#构造。所有它的指令都是"执行"由C#编译器。运行时不知道您使用了哪些#if指令。

为了动态更改类型的属性,在C#编译器完成后,您需要一个程序集重写构建步骤。这有很多缺点。

寻找其他方法。例如,将LOGGING_ENABLED定义为preprocessor symbol(使用项目设置)。

那就是说,我完全反对这种做法。如果您测试的代码不是生产中运行的代码,那么您将很难测试您的应用。尽可能在所有构建情况下使用相同的代码。这可能意味着您需要做出运行时决策。例如,您可能有不同的记录器,并在应用启动时选择一个。

答案 1 :(得分:1)

您不必将#define LOGGING_ENABLED添加到每个类文件的顶部,只需将其添加到项目选项/设置/属性中,这样在编译您的每个类文件时都可以使用它

答案 2 :(得分:1)

C#的方法是:

  1. 创建同一界面的2个独立实现:首先是日志记录,第二个是没有它。在运行时选择一个实现,检查LOGGING_ENABLED

  2. 的值
  3. 使用System.Diagnostics.Conditional属性。