我想检查某个整数类型是否属于(a)枚举成员。
例如,
public enum Enum1
{
member1 = 4,
member2 = 5,
member3 = 9,
member4 = 0
}
Enum1 e1 =(Enum1)4给我member1
Enum1 e2 =(Enum1)10什么也没给我,我想查一下。
答案 0 :(得分:57)
使用Enum.IsDefined
Enum.IsDefined(typeof(Enum1), 4) == true
但
Enum.IsDefined(typeof(Enum1), 1) == false
答案 1 :(得分:5)
Sam说,你可以使用IsDefined。这有点尴尬。您可能希望查看我的Unconstrained Melody图书馆,它可以让您这样做:
Enum1 e2 = (Enum1)10;
if (e2.IsNamedValue()) // Will return false
{
}
单个枚举调用可能不值得,但如果你用枚举做很多事情,你可能会发现一些有用的东西。
它应该比Enum.IsDefined
btw更快。它目前只进行线性扫描,但是如果你需要改进的话请告诉我:)(大多数枚举都很小,以至于他们可能不会从HashSet
中受益,但我们可以做二进制搜索...)
答案 2 :(得分:2)
int testNum = 5;
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum);
答案 3 :(得分:1)
查看枚举值并将它们与整数进行比较。
static bool EnumTest(int testVal, Enum e)
{
bool result = false;
foreach (var val in Enum.GetValues(typeof(Enum1)))
{
if ((int)val == testVal)
{
result = true;
break;
}
}
return result;
}
修改:看起来Sam有一个better solution。
答案 4 :(得分:1)
您可以使用Enum.GetValues获取所有已定义的值。然后检查您的值是否存在于该列表中 http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx
答案 5 :(得分:0)
请注意,如果您有3个枚举(苹果和梨),则上述方法将不会将其视为无效。
[Flags]
public enum Fruit
{
Apples=1,
Pears=2,
Oranges =4,
}
答案 6 :(得分:0)
这是我几年前写的一个扩展方法的一个简洁的小片段。将 TryParse 与 IsDefined 相结合,一次性完成所有工作并处理枚举中不存在的值。
if (value != null)
{
TEnum result;
if (Enum.TryParse(value.ToString(), true, out result))
{
// since an out-of-range int can be cast to TEnum, double-check that result is valid
if (Enum.IsDefined(typeof(TEnum), result.ToString() ?? string.Empty))
{
return result;
}
}
}
这是整数值的扩展
public static TEnum ParseToEnum<TEnum>(this int value, TEnum? defaultValue = null, bool useEnumDefault = false) where TEnum : struct
{
return ParseToEnumInternal(value, defaultValue, useEnumDefault);
}
还有一个用法
public enum Test
{
Value1 = 1,
Value2 = 3
}
var intValue = 1;
var enumParsed = intValue.ParseToEnum<Test>(); // converts to Test.Value1
intValue = 2;
enumParsed = intValue.ParseToEnum<Test>(); // either throws or converts to supplied default
enumParsed = 3.ParseToEnum<Test>(); // converts to Test.Value2
有些人不喜欢它如何悬挂在(可能为空的)值的末尾,但我有一个处理可空类型(int?)的空值的扩展,我自己喜欢它,所以...< /p>
如果您有兴趣,我可以像整个扩展方法的要点一样发布所有重载。
答案 7 :(得分:0)
使用:
if (Enum.IsDefined(typeof(Fruit),e2))
{
//Valid Value
}
else
{
//Invalid ENum Value
}