【发布时间】:2020-06-09 12:48:10
【问题描述】:
是否可以根据类中定义的一些常量值有条件地编译类和方法,例如我想要类似的东西。
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 属性),有没有办法根据类常量有条件地编译方法/类?有一个 Conditional 属性,但它似乎也只适用于定义。
我有一个具有多种构建模式的复杂项目,我想让其他人更轻松地构建我的项目。例如,我需要在一个设置上拥有 3 种不同的模式(可能更多),在另一种设置上拥有 2-3 种不同的模式。所以为了让其他人更容易编译我的项目,我需要有 3 * 3 = 9 个不同的预处理器定义和 9 个不同的 csproj 文件。如果我需要添加更多设置/模式/常量,这个故事并不能真正扩展。对于将编译我的代码但以前从未见过的人来说,这可能会变得非常混乱。至少编译器会对常量进行类型检查,因此不太可能搞砸。
显然,我可以构建代码以支持所有配置常量的变体,并在运行时基于它们调用代码,但我想进行优化,以便不会编译未使用的代码。
【问题讨论】:
-
好问题。我不认为这是可能的。如果您在问题中添加 why 您想避免“经典”条件编译(即,通过将常量定义为预处理器定义),这可能会有所帮助,以便人们可以为您的潜在问题提出替代解决方案.
-
我认为预处理是在编译之前完成的,并且在编译期间存在 const 信息。所以这是不可能的。让我们等待专家解答
-
@Heinzi 好建议
-
@Heinzi,添加了一些说明。