我需要两个具有不同名称的exacly idential枚举
我可以
enum DoorStatus{Open,Closed,Locked,Broken};
enum WindowStatus{Open,Closed,Locked,Broken};
Run Code Online (Sandbox Code Playgroud)
并且可能会更容易阅读.
但我宁愿不重复代码
在C++ id中
typedef Door,Window;
Run Code Online (Sandbox Code Playgroud)
C#中的灵魂是什么?
你为什么要问?我得到了Application That Handles处理一个Window
应用程序的应用程序Door.我希望Window应用程序devoloper使用'WindowStatus'向我发送数据,使用'Door'家伙使用'DoorStatus'枚举.
我相信用户应该知道或关心我有其他可以类似抽象的设备.
编辑:使用
enum HatchStatus{Open,Closed,Locked,Broken};
using DoorStatus = HatchStatus;
using WndowStatus = HatchStatus;
Run Code Online (Sandbox Code Playgroud)
EDIT2:
错误using子句必须位于命名空间中定义的所有其他元素之外,extern alias声明除外
:(
我想问题是,如果你有两个不同的枚举具有完全相同的值 - 那为什么要保持两者?
最好的解决方案是选择一个并重构一切只使用一个.
既然你已经更新了你的例子,我认为你应该考虑枚举是否真的是最好的解决方案.
public class ObjectState
{
public int ID { get; set; }
public string Description { get; set; }
}//should really be immutable
//should also implement IEquatable<ObjectState> for equality
public static readonly State_Open = new ObjectState()
{ ID = 1, Description = "Open" }
public static readonly State_Closed = new ObjectState()
{ ID = 2, Description = "Closed" }
public static class DoorStatus
{
public static readonly ObjectState Open = State_Open;
public static readonly ObjectState Closed = State_Closed;
}
//and WindowStatus if you want.
public class Door {
public ObjectState State { get; set; }
} //or perhaps refactor to a shared base/interface StatefulObject
Run Code Online (Sandbox Code Playgroud)
现在你可以简单地做:
new Door() { State = DoorStatus.Open; }
Run Code Online (Sandbox Code Playgroud)
如果你也实现了IEquatable<ObjectState>那么你也可以比较两个对象状态的相等性; 您可能也可能实现GetHashCode意味着您也可以将状态用作分组或字典中的键.
现在好处是,打开的窗口和打开的门现在具有完全相同的状态,而不是直接等同,而不是使用一些语法糖来绕过需要相同枚举的设计.
由于上述情况"非常复杂" - 尽管我认为这是好的设计; 您可以做的最好的事情是确保两个单独的枚举至少共享相同状态的相同基础值:
public enum States
{
Open
}
public enum DoorStates
{
Open = States.Open
}
public enum WindowStates
{
Open = States.Open
}
Run Code Online (Sandbox Code Playgroud)
最终,如果你使用枚举,你无法解决需要两个单独定义的问题 - 这个解决方案只是意味着Open对于任何可以处于Open状态的对象都是相同的.
| 归档时间: |
|
| 查看次数: |
6294 次 |
| 最近记录: |