替代解决方案
在我的公司,我们避免“跳过项目”来处理不常见的较低级别的项目。比如我们的表现层/API层只能引用我们的领域层,领域层只能引用数据层。
但是,当存在表示层和域层都需要引用的枚举时,这是一个问题。
这是我们(到目前为止)实施的解决方案。这是一个很好的解决方案,对我们来说效果很好。其他答案都在这方面。
基本前提是枚举不能被继承——但类可以。所以...
// In the lower level project (or DLL)...
public abstract class BaseEnums
{
public enum ImportanceType
{
None = 0,
Success = 1,
Warning = 2,
Information = 3,
Exclamation = 4
}
[Flags]
public enum StatusType : Int32
{
None = 0,
Pending = 1,
Approved = 2,
Canceled = 4,
Accepted = (8 | Approved),
Rejected = 16,
Shipped = (32 | Accepted),
Reconciled = (64 | Shipped)
}
public enum Conveyance
{
None = 0,
Feet = 1,
Automobile = 2,
Bicycle = 3,
Motorcycle = 4,
TukTuk = 5,
Horse = 6,
Yak = 7,
Segue = 8
}
然后,“继承”另一个更高级别项目中的枚举...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
这具有三个真正的优势......
- 两个项目中的枚举定义自动相同 - 通过
定义。
- 对枚举定义的任何更改都会自动
在第二个中呼应而无需对
二等。
- 枚举基于相同的代码 - 因此可以轻松比较这些值(有一些注意事项)。
要引用第一个项目中的枚举,可以使用类的前缀:BaseEnums.StatusType.Pending或添加一个“使用静态BaseEnums ;" 声明你的使用。
在第二个项目中处理继承类时,我无法让“使用静态...”方法工作,所以所有对“继承的枚举”将以类为前缀,例如SubEnums.StatusType.Pending。如果有人想出一种方法来允许在第二个项目中使用 “使用静态” 方法,请告诉我。
我确信可以对此进行调整以使其变得更好 - 但这确实有效,并且我在工作项目中使用了这种方法。