检查整数类型是否属于枚举成员

时间:2010-04-09 06:06:43

标签: c#

我想检查某个整数类型是否属于(a)枚举成员。

例如,

public enum Enum1
{
    member1 = 4,

    member2 = 5,

    member3 = 9,

    member4 = 0
}

Enum1 e1 =(Enum1)4给我member1

Enum1 e2 =(Enum1)10什么也没给我,我想查一下。

8 个答案:

答案 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
}