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
- 我究竟做错了什么?
- 在
C#
跨不同文件使用预处理器的正确方法是什么? - 有没有更好的方法呢?
在你的.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
部分代码。