C# 基于常量的条件编译?
是否可以基于类中定义的某个常量值有条件地编译类和方法,例如,我希望有类似的东西C# 基于常量的条件编译?,c#,.net,C#,.net,是否可以基于类中定义的某个常量值有条件地编译类和方法,例如,我希望有类似的东西 public enum BuildMode : int { One = 1, Two = 2, Three = 3 } public class BuildConfig { // I will change this line, based on what build I want public const BuildMode Mode = BuildMode.One; }
public enum BuildMode : int {
One = 1,
Two = 2,
Three = 3
}
public class BuildConfig {
// I will change this line, based on what build I want
public const BuildMode Mode = BuildMode.One;
}
public class SomeClass {
#if BuildConfig.Mode == BuildMode.One
public void SomeMethod() { /* Implementation one */ }
#elif BuildConfig.Mode == BuildMode.Two
public void SomeMethod() { /* Implementation two */ }
#elif BuildConfig.Mode == BuildMode.Three
public void SomeMethod() { /* Implementation three */ }
#endif
}
显然,我知道条件编译是如何在C#中完成的。一般来说,我想基于类中的常量值进行条件编译,而不是基于预处理器定义。知道很多编译时的东西都是使用常量的(比如Guid属性),有没有一种方法可以基于类常量有条件地编译方法/类?有一个条件属性,但它似乎也只适用于defines
我有一个具有多种构建模式的复杂项目,我想让其他人更容易构建我的项目。例如,我需要在一个设置上有3种不同的模式(可能更多),在另一个设置上有2-3种不同的模式。因此,为了让其他人更容易编译我的项目,我需要3*3=9个不同的预处理器定义和9个不同的csproj文件。如果我需要添加更多的设置/模式/常量,这个故事就不会真正扩展。对于那些将编译我的代码但以前从未见过的人来说,这可能会变得非常混乱。至少对于常量,编译器会对其进行类型检查,这样就不太可能把事情搞砸了
显然,我可以构建代码来支持配置常量的所有变体,并在运行时基于这些变量调用代码,但我希望进行优化,这样就不会编译未使用的代码。否-
C#不计算中的表达式-它只查看符号是否已定义:
当C#编译器遇到一个#if
指令,然后是一个#endif
指令时,它只在定义了指定符号的情况下编译指令之间的代码。与C和C++不同,不能将数值分配给符号。C#中的#if语句是布尔语句,只测试符号是否已定义
(增加重点)
因此,做你想做的事情的正确方法是:
public class SomeClass {
#if BUILD_MODE_ONE
public void SomeMethod() { /* Implementation one */ }
#elif BUILD_MODE_TWO
public void SomeMethod() { /* Implementation two */ }
#elif BUILD_MODE_THREE
public void SomeMethod() { /* Implementation three */ }
#endif
}
其中,符号可以在该代码文件中定义,也可以通过CSC.EXE的命令行参数定义。好问题。我认为这是不可能的。如果您在问题中添加了为什么要避免“经典”条件编译(即,通过将常量定义为预处理器定义),这样人们就可以为您的根本问题提出替代解决方案,这可能会有所帮助。我认为预处理是在编译之前完成的,编译过程中会出现常量信息。所以这是不可能的。让我们等待专家answers@Heinzi好suggestion@Heinzi,添加了一些说明。是否有方法使MSBuild解析我的BuildConfig类并生成正确的定义?