是否可以基于类中定义的常量值有条件地编译类和方法,例如,我希望有这样的东西。
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属性),有没有办法根据类常量有条件地编译方法/类呢?有一个条件属性,但它似乎也只适用于定义。
我有一个复杂的项目,有多种构建模式,我想让其他人更容易构建我的项目。例如,我需要在一个设置上有3种不同的模式(可能更多),在另一种设置上有2-3种不同的模式。所以为了让其他人更容易编译我的项目,我需要3*3=9个不同的预处理器定义和9个不同的csproj文件。如果我需要添加更多的设置/模式/常量,那么这个故事就不能真正扩展。对于一个将要编译我的代码的人来说,它可能会变得非常混乱,但是之前没有见过它。至少有了常量,编译器会检查它的类型,这样就不会有太多的可能把事情搞砸。
显然,我可以构建代码来支持配置常量的所有变体,并在运行时基于它们调用代码,但我希望进行优化,使未使用的代码不会被编译进来。
发布于 2020-06-09 21:32:00
不是的-
C#不会计算#if preprocessor directive中的表达式-它只会查看符号是否已定义:
当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的命令行参数定义。
https://stackoverflow.com/questions/62282998
复制相似问题