未定义时,枚举不默认为0

时间:2016-09-23 12:43:40

标签: c# enums default-value

我的枚举类型定义如下:

public enum OperationTypeEnum : byte
{
    /// <remarks/>
    @__NONE = 0,

    /// <remarks/>
    Sale = 1,

    /// <remarks/>
    Auth = 2
}

在我的代码中,我像这样抛出一个整数:

var operationType = (OperationTypeEnum) anotherIntVariable;

当anotherIntVariable未定义时(例如5),我希望返回0或__NONE(因为5未被定义为有效的枚举值之一,但我收到了5。

我需要更改什么才能将未定义的枚举值设为0?

谢谢!

5 个答案:

答案 0 :(得分:1)

C#枚举实际上是整数,并且没有编译或运行时检查您使用定义的枚举集中的“有效”值。有关详细信息,请参阅此答案https://stackoverflow.com/a/6413841/1724034

答案 1 :(得分:1)

答案是@ plast1k。

以下是您的问题的通用扩展

public static class OperationTypeEnumExtensions
{
    public static T ToEnum<T>(this byte val) where T : struct
    {
        if(Enum.IsDefined(typeof(T), val)) 
            return (T) Enum.Parse(typeof(T), val.ToString());
        return default(T);
    }
}

使用

value.ToEnum<OperationTypeEnum>()

答案 2 :(得分:0)

如果您获得数值并且只需要获取实际的枚举值,则可以使用Enum.TryParse

  

该示例显示以下输出:
  已转换&#39; 0&#39;没有。
  已转换为&#39; 2&#39;绿色。
   8不是Colors枚举的基础值。
  blue不是Colors枚举的成员。
  转换后的蓝色&#39;蓝色。
  黄色不是Colors枚举的成员。

using System;

[Flags] enum Colors { None=0, Red = 1, Green = 2, Blue = 4 };

public class Example
{
    public static void Main()
    {
       string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" };
       foreach (string colorString in colorStrings)
       {
          Colors colorValue;
          if (Enum.TryParse(colorString, out colorValue))        
             if (Enum.IsDefined(typeof(Colors), colorValue) | colorValue.ToString().Contains(","))  
                Console.WriteLine("Converted '{0}' to {1}.", colorString, colorValue.ToString());
             else
                Console.WriteLine("{0} is not an underlying value of the Colors enumeration.", colorString);
          else
             Console.WriteLine("{0} is not a member of the Colors enumeration.", colorString);
       }
    }
}

答案 3 :(得分:0)

最安全的方法是为你的枚举类创建一个扩展方法,它将比较枚举值,如果它们都没有初始化为@__ NONE

如果您确定只有有限数量的枚举值:

public static class OperationTypeEnumExtensions
{
    public static OperationTypeEnum ToOperationTypeEnum(this int val)
    {
        switch (val)
        {
            case (int) OperatinTypeEnum.Sale:
                return OperationTypeEnum.Sale;

            cast (int) OperationTypeEnum.Auth:
                return OperationTypeenum.Auth;

             default:
                return OperationTypeEnum.@_none;
        }
    }
}

用法:

int myInt = GetMyIntValue();
OperationTypeEnum myEnum = myInt.ToOperationTypeEnum();

答案 4 :(得分:0)

#如果您的枚举类定义如下。

    public enum CategoryEnum : int
    {
        Undefined = 0,
        IT= 1,
        HR= 2,
        Sales= 3,
        Finance=4
    }

现在,如果要查找未定义的枚举(如果值与1,2,3,4不匹配),请使用以下 Enum.IsDefine()函数

Enum.IsDefined(typeof(CategoryEnum), request.CategoryId)

#returns true if id matches any enum values
#else returns false

现在用于将枚举值解析为字符串


public enum Mode
    {
        UNDEFINED = 0,
        APP = 1,
        TEXT = 2,
    }

var value = Enum.TryParse(request.Mode, true, out Mode mode);
#returns mode enum

#现在要获取id或反之对应的值,请使用以下扩展方法:

  public static T AsEnum<T>(this string input) where T : struct, IConvertible
        {

            if (!typeof(T).IsEnum)
            {
                throw new ArgumentException("T must be an enumerated type");
            }

            Enum.TryParse(input, ignoreCase: true, out T result);

            return (T)result;

        }
  • 然后使用 AsEnum()函数来获取它:
var status = searchText.AsEnum<StatusEnum>();