定义的枚举不能按预期工作

时间:2017-09-12 07:07:27

标签: c# .net enums

我有以下枚举,我需要根据客户端选择进行验证

    [Flags]
    enum Colour
    {
        Black = 1,
        Blue = 2,
        Green = 4,
        Yellow = 8
    }



var isValid = Enum.IsDefined(typeof(Colour), 5);

如果5是有效值,为什么返回false(Colour.Black | Colour.Green)

3 个答案:

答案 0 :(得分:1)

因为这是正确的结果。 "如果enumType是使用FlagsAttribute属性定义的枚举,如果设置了value中的多个位字段但是value不对应于复合枚举值,或者value是字符串串联,则该方法返回false多位标志的名称。" 有关IsDefined如何工作的详细信息,请参阅MSDN

UPD:任何枚举的解决方案:

static class EnumExtensions
{
    public static bool IsSuitable(Type enumType, int value)
    {
        if (!enumType.IsEnum)
        {
            throw new ArgumentException(nameof(enumType));
        }

        var entities = Enum.GetValues(enumType);
        int composite = 0;
        foreach (var entity in entities)
        {
            composite |= (int)entity;
        }

        return (composite | value) == composite;
    }
}

它给出了这个结果:

var suit = EnumExtensions.IsSuitable(typeof(Colour), 5); // true
var suit2 = EnumExtensions.IsSuitable(typeof(Colour), 333); //false

答案 1 :(得分:1)

Enum.IsDefined()函数的返回值取决于枚举定义。 实际上,如果'5'在您定义的枚举的值集合中,则会进行检查。

答案 2 :(得分:0)

    [Flags]
    enum Colour
    {
        Black = 1,  // 0001
        Blue = 2,   // 0010
        Green = 4,  // 0100
        Yellow = 8  // 1000
    }

    static void Main(string[] args)
    {
        var isValid = Enum.IsDefined(typeof(Colour), 5); // 5 is 0101
    }

Enum.IsDefined: 返回指定枚举中是否存在具有指定值的常量的指示。

在你的例子中,你有值1,2,4,8,为什么你认为值5应该返回true?

    [Flags]
    enum Colour
    {
        Black = 1,
        Blue = 785,
        Green = 4,
        Yellow = 666
    }

    static void Main(string[] args)
    {
        var isValid = Enum.IsDefined(typeof(Colour), 666); // true
        var isValid2 = Enum.IsDefined(typeof(Colour), 785); // true
        var isValid3 = Enum.IsDefined(typeof(Colour), 5); // false
    }