C#使用多个键为相同的值启用枚举

时间:2018-03-06 12:05:26

标签: c# .net enums switch-statement

我已经在C#中搜索了如何切换值而不是枚举键,但是没有结果,我发现的所有帖子都说我们不需要使用该值,我们可以使用密钥。

但在我的情况下,我想使用该值,因为我使用多个键共享相同的值进行枚举,这里是代码:

public enum PlayerPosition {
    North = 0,
    Top = 0, 
    South = 1,
    Bottom = 1,
    East = 2,
    Right = 2,
    West = 3,
    Left = 3
}


switch (obj.PlayerPosition)
{
    case PlayerPosition.North:
        // some code
        break;
    case PlayerPosition.South:
        // some code
        break;
    case PlayerPosition.East:
        // some code
        break;
    case PlayerPosition.West:
        // some code
        break;
    default:
        throw new ArgumentOutOfRangeException();
}

我认为这是有效的,但我发现它真的不可读......

我想要达到的目标是:

switch (obj.PlayerPosition)
{
    case PlayerPosition.Top:
    case PlayerPosition.North:
        // some code
        break;
    case PlayerPosition.Bottom:
    case PlayerPosition.South:
        // some code
        break;
    case PlayerPosition.Right:
    case PlayerPosition.East:
        // some code
        break;
    case PlayerPosition.Left:
    case PlayerPosition.West:
        // some code
        break;
    default:
        throw new ArgumentOutOfRangeException();
}

上面的例子不起作用,因为它是一个重复的案例标签。 我怎么能做到这一点?

编辑:在此枚举中,North / Top,South / Bottom完全相同,它们只代表玩家在有4把椅子的桌子周围的位置。但是我们有使用North / South / East / West的旧配置文件以及使用Top / Bottom / Right / Left的新配置文件。

4 个答案:

答案 0 :(得分:2)

我在dotnetfiddle中对此进行了测试:只需使用新成员即可:

public enum MyEnum
{
    North  = 0, //old
    Top    = 0, //new
    South  = 1, //old
    Bottom = 1  //new
}

public static void Main()
{
    // Parse "old" from XML config (simulated)
    MyEnum test = (MyEnum)Enum.Parse(typeof(MyEnum),"North");
    //          = MyEnum.North

    switch(test)
    {
        case MyEnum.Top:
            Console.WriteLine("NORTH");
            break;
        case MyEnum.Bottom:
            Console.WriteLine("SOUTH");
            break;
        default:
            Console.WriteLine("Unsupported!");
            break;

    }
}

将输出" NORTH"。

修改

关于您所面临的实际问题的简单说明:向下兼容性。 我要做的是在启动时检查配置是否与您当前的程序版本兼容。如果不是:通过"升级"功能(保存旧配置的备份,然后)将配置转换为当前版本并将其保存回磁盘。

答案 1 :(得分:1)

您应该修改配置文件的解析器,以便在它成为问题之前解决此问题。

您的程序一次只能是一个版本。现在的方式是,你有两个版本的配置文件,并且你试图同时维护两个版本的代码。

处理旧版配置文件的常规方法是在读取数据时将数据转换为新格式,或在首次打开时检测数据并将其在磁盘上转换为新版本(可选择通知用户) )。

答案 2 :(得分:0)

我无法理解为同一个枚举值设置两个不同标签的原因,而没有两个单独的枚举。 Firslty回答你的问题,你可以将枚举值转换为int,然后对int进行比较......

int value =  (int)obj.PlayerPosition

但我可能会考虑删除重复的值并使用两个枚举

public enum PlayerPosition {
    Top = 0, 
    Bottom = 1,
    Right = 2,
    Left = 3
}

public enum CompassPosition {
    North = 0, 
    South= 1,
    East= 2,
    West = 3
}

如果您想在两者之间进行转换,例如

PlayerPosition pos = PlayerPosition.Left;
CompassPosition compass = (CompassPosition)pos;
Console.WriteLine(compass.ToString());

答案 3 :(得分:0)

你不能用枚举来做这件事。枚举的目的是每个项目具有不同的值,并且可以与其他项目区分开来。为什么你会使用Top和North是相同的东西,而你总是可以使用North并避免混淆顶部?我个人只会有北,南,东和西,并删除其他人。

但是,据我所知,这应该有效:

public enum PlayerPosition {
    North,
    Top, 
    South,
    Bottom,
    East,
    Right,
    West,
    Left
}

switch (obj.PlayerPosition)
{
    case PlayerPosition.Top:
    case PlayerPosition.North:
        // some code
        break;
    case PlayerPosition.Bottom:
    case PlayerPosition.South:
        // some code
        break;
    case PlayerPosition.Right:
    case PlayerPosition.East:
        // some code
        break;
    case PlayerPosition.Left:
    case PlayerPosition.West:
        // some code
        break;
    default:
        throw new ArgumentOutOfRangeException();
}