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

时间:2008-11-07 15:37:29

标签: c# c-preprocessor

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

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

#define oracle

// ...    

#if oracle
// some code
#else
// some different code.
#endif

4 个答案:

答案 0 :(得分:13)

绝对不是,#define在编译器甚至看到它之前由预处理器编译出来 - 所以令牌'oracle'甚至不在你的代码中,只是'1'或'0'。将#define更改为全局变量或(更好)返回正确值的函数。

答案 1 :(得分:2)

#if是编译时。您可以在构建过程中指定它(通过切换到msbuild / csc),但不是在运行时。排除的代码不存在。您可能最好建议(1):

  • 使用Dependency Injection / IoC
  • 为每个后端分别设置DAL堆栈
  • 使用支持
  • 的ORM工具
  • 根据提供商(在单个DAL中)对代码进行分支

答案 2 :(得分:0)

不,预编译器在编译之前运行,并且可以在那时更改代码,这就是它的目的,如果你想在运行时基于某些东西切换行为使用变量和普通的条件逻辑。

答案 3 :(得分:-2)

你的设计错了。绝对错了。这可能是20年前可以接受的,但是有很多更好的技术可以满足您的需求。

您需要将所有数据访问逻辑划分为不依赖于实际实现的接口(基于sql或基于oracle),然后使用DI / IoC在运行时注入所需的实现。它比声音简单得多,效果非常好,使您的代码易于测试,并允许您自定义和更新您的应用程序,而无需进行整个重新安装。

相关问题:
https://stackoverflow.com/questions/45191/ioc-explain-and-more-important-when-to-use-it
Inversion of Control with .net
https://stackoverflow.com/questions/71041/which-single-iocdi-container-would-you-recommend-using-and-why