如何为同一枚举指定两个名称?(类型名称别名)

本文关键字:两个 别名 类型 枚举 | 更新日期: 2023-09-27 18:27:56

我需要两个完全相同、名称不同的枚举

我可以做

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

而且可能会更容易阅读。

但我不想重复代码

在C++中,我会做

typedef Door,Window;

C#中的解决方案是什么?

为什么你们两个都问?我得到了处理Window的应用程序处理CCD_ 2。

我希望Window应用程序开发人员使用"WindowStatus"枚举向我发送数据"Door"家伙使用"DoorStatus"枚举。

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

EDIT:使用

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

第2版:

错误using子句必须位于命名空间中定义的除外部别名声明之外的所有其他元素之前

:(

如何为同一枚举指定两个名称?(类型名称别名)

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

using Enum2 = Enum1;

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

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

更新

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

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状态的对象都是相等的。