C#中不同文件的预处理程序指令

我知道我可以在C#使用预处理程序指令来启用/禁用某些代码的编译。

如果我在同一个文件中定义一个指令,它可以正常工作:

 #define LINQ_ENABLED using System; using System.Collections.Generic; #if LINQ_ENABLED using System.Linq; #endif 

现在,我在C++中使用将所有这些配置指令放在单个头文件中,并将其包含在我需要这些指令的所有文件中。

如果我在C#做同样的事情则不起作用:

 //Config.cs #define LINQ_ENABLED //MyClass.cs #define LINQ_ENABLED using System; using System.Collections.Generic; #if LINQ_ENABLED using System.Linq; #endif 

我也尝试了以下但似乎我无法在命名空间内定义指令:

 //Config.cs namespace Conf{ #define LINQ_ENABLED } //MyClass.cs #define LINQ_ENABLED using System; using System.Collections.Generic; using Conf; #if LINQ_ENABLED using System.Linq; #endif 
  1. 我究竟做错了什么?
  2. C#跨不同文件使用预处理器的正确方法是什么?
  3. 有没有更好的方法呢?

在你的.csproj中有一节:

    TRACE;DEBUG;LINQ   

如果您需要额外的预处理器,可以在那里添加它们。

或者通过项目的属性自动为您添加它们。 在“构建”选项卡下的属性中。

您可以从Project | Properties中为整个项目执行此操作。

Afaik没有办法在C#中使用包含文件,所以对于文件组,没有简单的解决方案。

而不是添加条件编译到您的文件,并添加使用Linq的代码块,以及其他没有。 我将所有数据访问逻辑(即具有两个实现的代码 – 使用Linq和不使用)移动到单独的库中。

例如,创建主应用程序将使用的接口。 并创建这些接口的两个实现 – 一个使用Linq,另一个不使用:

在主要项目中:

 public interface IUserRepository { IEnumerable GetUsersByCompanyName(string companyName); } 

Persistence.Linq.dll中

 using System.Linq; public class UserRepository : IUserRepository { public IEnumerable GetUsersByCompanyName(string companyName) // use Linq here } 

Persistence.SomethingOther.dll中

 public class UserRepository : IUserRepository { public IEnumerable GetUsersByCompanyName(string companyName) // do not use Linq here } 

现在,您可以将IUserRepository任何实现注入到主应用程序类中。

没有意义在使用时应用#define ,因为这样你就不会从你的项目中取消链接库,我想,你想避免在某些情况下引用它们。

.NET中没有条件程序集引用(如果不是手动,动态完成)。

因此,预处理程序指令的主要用途是在命名空间enable/disable部分代码。