我的项目中有一个包含全局配置的类,如下所示:
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
放在每个类文件的顶部,这会破坏整个目的。
答案 0 :(得分:2)
这是不可能的。 C#预处理器是C#构造。所有它的指令都是"执行"由C#编译器。运行时不知道您使用了哪些#if
指令。
为了动态更改类型的属性,在C#编译器完成后,您需要一个程序集重写构建步骤。这有很多缺点。
寻找其他方法。例如,将LOGGING_ENABLED
定义为preprocessor symbol(使用项目设置)。
那就是说,我完全反对这种做法。如果您测试的代码不是生产中运行的代码,那么您将很难测试您的应用。尽可能在所有构建情况下使用相同的代码。这可能意味着您需要做出运行时决策。例如,您可能有不同的记录器,并在应用启动时选择一个。
答案 1 :(得分:1)
您不必将#define LOGGING_ENABLED
添加到每个类文件的顶部,只需将其添加到项目选项/设置/属性中,这样在编译您的每个类文件时都可以使用它
答案 2 :(得分:1)
C#的方法是:
创建同一界面的2个独立实现:首先是日志记录,第二个是没有它。在运行时选择一个实现,检查LOGGING_ENABLED
。
使用System.Diagnostics.Conditional
属性。