C# 有没有办法在运行时设置#define的值?

C# 有没有办法在运行时设置#define的值?,c#,c-preprocessor,C#,C Preprocessor,我想知道是否有办法在运行时设置#define的值 我假设在下面的代码中有一个针对特定于Oracle和特定于Sql Server的查询 #define oracle // ... #if oracle // some code #else // some different code. #endif 绝对不是这样的,#定义是在编译器看到它之前由预处理器编译出来的-因此标记“oracle”甚至不在代码中,只有“1”或“0”。将#define更改为全局变量或(更好)返回正确值的函数。#如

我想知道是否有办法在运行时设置#define的值

我假设在下面的代码中有一个针对特定于Oracle和特定于Sql Server的查询

#define oracle

// ...    

#if oracle
// some code
#else
// some different code.
#endif
绝对不是这样的,#定义是在编译器看到它之前由预处理器编译出来的-因此标记“oracle”甚至不在代码中,只有“1”或“0”。将#define更改为全局变量或(更好)返回正确值的函数。

#如果
是编译时。您可以在构建过程中指定这一点(通过切换到msbuild/csc),但实际上不能在运行时指定。排除的代码不存在。您最好选择(1个):

  • 使用依赖注入/IoC为每个后端提供单独的DAL堆栈
  • 使用支持以下两种方法之一的ORM工具
  • 基于提供程序的代码分支(在单个DAL中)

否,预处理器在编译之前运行,并且可以在编译时更改代码,这就是它的目的,如果您想在运行时基于某些内容切换行为,请使用变量和正常条件逻辑