Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于常量的条件编译?_C#_.net - Fatal编程技术网

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类并生成正确的定义?