基于每个文件的C#编译器常量?

基于每个文件的C#编译器常量?,c#,.net,visual-studio,multiple-inheritance,compiler-constants,C#,.net,Visual Studio,Multiple Inheritance,Compiler Constants,是否可以基于每个文件/项目项定义编译器常量 背景: 我想实现一个数据库抽象层(DAL),它将所有读和写任务分开,但保留一个既可以做这两件事,又不多次实现相同方法的DAL(抽象类意味着每个受支持的数据库类型将有一个实例类) 所以我想这样分开我的DAL: abstract class ReadDAL abstract class WriteDAL abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL).

是否可以基于每个文件/项目项定义编译器常量

背景: 我想实现一个数据库抽象层(DAL),它将所有读和写任务分开,但保留一个既可以做这两件事,又不多次实现相同方法的DAL(抽象类意味着每个受支持的数据库类型将有一个实例类)

所以我想这样分开我的DAL:

abstract class ReadDAL
abstract class WriteDAL
abstract class ReadWriteDAL (multiple-inheritance from Read&Write-DAL).
不幸的是,这不起作用,因为C#不支持多重继承

因此,解决此问题的一种方法是定义接口:

abstract class ReadDAL : IReadDAL
abstract class WriteDAL : IWriteDAL
abstract class ReadWriteDAL : IReadDAL, IWriteDAL
但是,如果我这样做,我将不得不在每次更改其中一个DAL中的方法时更改接口定义,并更改ReadWriteDAL中定义的方法,并且我必须将粘贴复制到方法实现的某个位置,这意味着将出现完全不符合性的混乱

我想我能做的是第二次添加相同的文件作为链接,并在每个项目项的基础上定义:

#if SOMECONSTANT // true if file is PartialReadDAL.cs
public partial abstract class ReadDAL
#else // false if "file" is link called "PartialReadWriteDAL.cs" symlinking to PartialReadDAL.cs
public partial abstract class ReadWriteDAL
#endif 
and here some implementation. 
但是我可以为每个文件定义一个编译器常量吗

或者以某种方式达到类似的效果

符号链接路线将非常非常混乱。当被迫这样做时,我会通过在相关文件中预先添加一些
#define
作为预构建步骤来实现这一点。然后我会
#如果
在代码中存在这些符号。尽管如此,我还是不喜欢这样:我想,即使我在构建结束后清除了这个标记,它也不会像我希望的那样透明,所以它不会进入版本控制


ReadWriteDAL
将包含它自己的一些状态,还是它将只是一个调用
ReadDAL
WriteDAL
的方法的调度程序?如果它只是一个调度器,您可能会考虑放弃实际的实现(<代码> Read Read Edg/<代码>),并将调用传递到<代码> IReadDAL < /C> >和<代码> iWrdEdAl/<代码>。我是为Castle Windsor写的。

你能在接口上实现你的方法作为扩展方法吗?@Lucas Trzesniewski:首先,我不想要扩展方法。第二个可能不是,即使我想。想法:从T4模板生成
ReadWriteDAL
,该模板生成到
ReadDAL
WriteDAL
的转发方法(可以将其实例传递给构造函数,或者假设适当的默认值)。本质上,
ReadWriteDAL
不包含任何有趣的代码,因此它可以也可能应该由计算机编写。另一个不涉及代码生成的想法是:将
ReadWriteDAL
隐式转换运算符赋给只返回适当实例的
(I)ReadDAL
(I)WriteDAL
。这并不能很好地替代真实的东西,但它很接近。这两种观点都依赖于构图。