替代解决方案
在我的公司中,我们避免“跳过项目”进入非常见的较低级别的项目。例如,我们的表示/ 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。如果有人提出允许“使用静态”的方法在第二个项目中使用方法的方法,请告诉我。
我敢肯定,可以对其进行调整以使其变得更好-但这确实有效,并且我在工作项目中使用了这种方法。
如果您认为有帮助,请对其进行投票。