如何给同一个枚举两个名字? (类型名称别名)

时间:2012-03-16 09:01:47

标签: c#

我需要两个具有不同名称的极端识别枚举

我能做到

enum DoorStatus{Open,Closed,Locked,Broken};
enum WindowStatus{Open,Closed,Locked,Broken};

并且可能会更容易阅读。

但我不想重复代码

在C ++ id中执行

typedef Door,Window;

C#中的灵魂是什么?

你为什么要问? 我得到了一个处理Window的应用程序 处理Door的应用程序。 我希望Window应用程序devoloper使用'WindowStatus'枚举向我发送数据 'Door'家伙使用'DoorStatus'枚举。

我相信用户应该知道或关心我有其他可以类似抽象的设备。

编辑:使用

enum HatchStatus{Open,Closed,Locked,Broken};
using DoorStatus = HatchStatus;
using WndowStatus = HatchStatus;

EDIT2:

错误using子句必须在命名空间中定义的所有其他元素之前,但extern alias声明

除外

:(

2 个答案:

答案 0 :(得分:12)

如果您只想要别名,可以使用using指令:

using Enum2 = Enum1;

答案 1 :(得分:5)

我想问的问题是,如果你有两个具有完全相同值的不同枚举 - 那为什么要保留两者?

最好的解决方案是选择一个并重构所有内容以仅使用一个。

更新

既然你已经更新了你的例子,我认为你应该考虑枚举是否真的是最好的解决方案。

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

现在你可以做到:

new Door() { State = DoorStatus.Open; }

如果你也实现IEquatable<ObjectState>,那么你也可以比较两个对象状态的相等性;您可能会实现GetHashCode,这意味着您也可以将状态用作分组或字典中的键。

现在好处是,开窗和开门现在都具有完全相同的状态,而不是使用一些语法糖来绕过需要相同枚举的设计。

最终更新

由于上述情况“非常复杂” - 尽管如此,我认为,良好的设计;您可以做的最好的事情是确保两个单独的枚举至少共享相同状态的相同基础值:

public enum States
{
  Open
}

public enum DoorStates
{
  Open = States.Open
}

public enum WindowStates
{
  Open = States.Open
}

最终,如果你使用枚举,你无法解决需要两个单独定义的问题 - 这个解决方案只是意味着Open对于任何可能处于Open状态的对象都是相同的