开发者

Check that integer type belongs to enum member

I want to check that some integer type belongs to (an) enumeration member.

For Example,

public enum Enum1
{
    member1 = 4,

    member2 = 5,

    member3 开发者_Python百科= 9,

    member4 = 0
}

Enum1 e1 = (Enum1)4 gives me member1

Enum1 e2 = (Enum1)10 gives me nothing and I want to check it.


Use Enum.IsDefined

Enum.IsDefined(typeof(Enum1), 4) == true

but

Enum.IsDefined(typeof(Enum1), 1) == false


As Sam says, you can use IsDefined. This is somewhat awkward though. You may want to look at my Unconstrained Melody library which would let you us:

Enum1 e2 = (Enum1)10;
if (e2.IsNamedValue()) // Will return false
{
}

It's probably not worth it for a single enum call, but if you're doing a lot of stuff with enums you may find some useful things in there.

It should be quicker than Enum.IsDefined btw. It only does a linear scan at the moment, but let me know if you need that to be improved :) (Most enums are small enough that they probably wouldn't benefit from a HashSet, but we could do a binary search...)


int testNum = 5;
bool isMember = Enum.GetValues(typeof(Enum1)).Cast<int>().Any(x => x == testNum);


You look through the values of the enum and compare them to the integer.

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

Edit: Looks like Sam has a better solution.


You can use Enum.GetValues to get all defined values. Then check if your value exists in that list.
http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx


Be careful this won't work if you have an enum for 3 (Apples and Pears) the methods above won't detect it as valid.

[Flags]
public enum Fruit
{ 

    Apples=1,

    Pears=2,

    Oranges =4,

}


Here's a succinct little snippet from an extension method I wrote a few years ago. Combines TryParse with IsDefined to do it all in one swoop and handle values that don't exist in the enum.

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

Here's the extension for integer values

public static TEnum ParseToEnum<TEnum>(this int value, TEnum? defaultValue = null, bool useEnumDefault = false) where TEnum : struct
{
    return ParseToEnumInternal(value, defaultValue, useEnumDefault);
}

And a usage

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

Some people don't like how it dangles off the end of the (potentially nullable) value, but I have an extension that handles null values of nullable types (int?) and I like it myself, so ...

I can post like a Gist of the whole extension method with all the overloads if you're interested.


Use:

if (Enum.IsDefined(typeof(Fruit),e2))
{
   //Valid Value
}
else
{
   //Invalid ENum Value
}


Found this useful. https://stackoverflow.com/a/64374930/16803533

no need to use IsDefined and No range checking

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜