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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#使用多个键为相同的值启用枚举相关的知识,希望对你有一定的参考价值。

我已经搜索了如何在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的新配置文件。

答案

我在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”。

编辑

只谈一下你面临的实际问题:向下兼容性。我要做的是在启动时检查配置是否与您当前的程序版本兼容。如果没有:通过“升级”功能(保存旧配置的备份然后)将配置转换为当前版本并将它们保存回磁盘。

另一答案

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

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

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

另一答案

你不能用枚举来做到这一点。枚举的目的是每个项目具有不同的值,并且可以与其他项目区分开来。为什么你会使用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();
}
另一答案

我无法理解为相同的枚举值设置两个不同标签背后的原因,而没有两个单独的枚举。 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());

以上是关于C#使用多个键为相同的值启用枚举的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法

c的printf怎么输出枚举类型变量

如果枚举映射键为空或未知,则忽略 JSON 反序列化

1812

具有相同布局的多个片段

Kotlin 相同片段多个活动