我的枚举类型定义如下:
public enum OperationTypeEnum : byte
{
/// <remarks/>
@__NONE = 0,
/// <remarks/>
Sale = 1,
/// <remarks/>
Auth = 2
}
在我的代码中,我像这样抛出一个整数:
var operationType = (OperationTypeEnum) anotherIntVariable;
当anotherIntVariable未定义时(例如5),我希望返回0或__NONE(因为5未被定义为有效的枚举值之一,但我收到了5。
我需要更改什么才能将未定义的枚举值设为0?
谢谢!
答案 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;
}
var status = searchText.AsEnum<StatusEnum>();