正确转换为枚举

时间:2016-07-23 01:18:42

标签: c# enums

我有一个带有一堆看起来像这样的值的枚举。请注意,我使用0表示“未定义”。

public enum MyEnum
{
   Apple = 1,
   Banana = 2,
   Orange = 3,
   Undefined = 0
}

我想创建一个转换方法,它将接收一个int值并返回枚举,但我想确保如果收到一个不在我的枚举中的值,我将返回“Undefined”。我有以下代码,但如果我通过47,我想确保我得到MyEnum.Undefined。我应该如何修改此代码,以便任何未定义的值返回MyEnum.Undefined。

public static MyEnum GetEnum(int value)
{
   var enumValue = MyEnum.Undefined;

   if(value > 0)
      enumValue = (MyEnum)value;

   return enumValue;
}

3 个答案:

答案 0 :(得分:4)

只需使用Enum.IsDefined

public static MyEnum GetEnum(int value) =>
    Enum.IsDefined(typeof(MyEnum), value) ? (MyEnum) value : MyEnum.Undefined;

完整示例:

using System;

public enum MyEnum
{
    // Moved here as it's more conventional.
    Undefined = 0,
    Apple = 1,
    Banana = 2,
    Orange = 3
}

class Test
{
    public static void Main()
    {
        Console.WriteLine(GetEnum(5)); // Undefined
        Console.WriteLine(GetEnum(0)); // Undefined
        Console.WriteLine(GetEnum(-1)); // Undefined
        Console.WriteLine(GetEnum(3)); // Orange
    }

    public static MyEnum GetEnum(int value) =>
        Enum.IsDefined(typeof(MyEnum), value) ? (MyEnum) value : MyEnum.Undefined;
}

答案 1 :(得分:2)

Enum.IsDefined可能确实适合您的需求,但了解一些注意事项非常重要:

  • 它包含Enum值 - 耗费内存分配
  • 分配一些数组
  • 它使用Reflection(尽管已缓存)获取有效值列表并搜索它们

这些事实使它比一个简单的开关更昂贵

public static MyEnum GetEnum(int value)
{
    var enumValue = (MyEnum)value;
    switch (enumValue)
    {
        case MyEnum.Apple:
        case MyEnum.Banana:
        case MyEnum.Orange:
           return enumValue;
        case MyEnum.Undefined:
        default:
           return MyEnum.Undefined;
    }

此代码的危险在于,每当您向枚举添加字段时,您都需要更新它 - 但是枚举几乎总是如此。静态分析器可以在这里提供帮助(例如,ReSharper会发出switch缺少某些case的警告。

答案 2 :(得分:0)

请使用:

public static MyEnum GetEnum(int value)
{
    return ((Enum.IsDefined(typeof(MyEnum), value)) ? (MyEnum)value : MyEnum.Undefined);
}

或者如果你想使用一个字符串,你可以使用它:

public static MyEnum GetEnumByString(string value)
{
    return ((Enum.IsDefined(typeof(MyEnum), value)) ? (MyEnum)value : MyEnum.Undefined);
}