2016-07-23 141 views
3

我有一堆看起来像这样的值的枚举。请注意,我使用“undefined”作为0。正确转换为枚举

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

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

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

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

    return enumValue; 
} 
+0

那么13的值呢?你也必须检查上限。 –

回答

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; 
} 
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); 
} 
2

Enum.IsDefined可能确实满足您的需求,但要知道有几个注意事项是很重要的:

  • 这盒枚举值 - 成本内存分配
  • 它分配几个阵列
  • 它使用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)。