是否可以在C#中检查运行时的编译器常量?

时间:2013-07-09 18:41:06

标签: c# .net compiler-construction compiler-constants

我知道我可以通过有条件地包括如下代码来有条件地设置变量:

#if DEBUG
   someVar = "foo";
#else
   someVar = "bar";
#endif

我宁愿在运行时枚举或测试编译器常量。

例如,我想将编译时定义的所有符号放在窗口标题中,以便测试人员可以看到他们正在测试哪个版本。

3 个答案:

答案 0 :(得分:3)

我认为你不能动态枚举它们

您在C#中使用编译器常量可以做的唯一事情是定义它们并使用defundef取消定义它们,并查看它们是否与ifelse一起存在, elifendif,一旦编译了程序,除非你做这样的事情,否则无法判断你有什么变量

private static List<string> compileConstants = new List<string>();

#if DEBUG
  compileConstants.Add("DEBUG");
#endif

除此之外,我不认为还有其他办法。编译器常量是在将信息传递给程序集时定义和使用的。我不认为它实际上是以在C#中运行时可以访问它们的方式保存的。

答案 1 :(得分:3)

我认为预处理器会在编译时删除未使用的代码。

但是你可以使用conditional attributes以更清洁的方式完成同样的事情:

[Conditional("DEBUG")]
public void DrawDebugTitle() {
   Form1.Title = "Debug mode";
}

然后简单地调用方法,如果定义了DEBUG,那么它将改变表单的标题,如果没有定义DEBUG,那么方法调用虽然仍然出现在你的代码中,但什么都不做。

答案 2 :(得分:1)

编译器常量不会存储在已编译程序集中的任何位置。因此,无法在运行时访问它们。