如何检查枚举变量是否分配了单个枚举值?

时间:2010-09-07 10:50:34

标签: c#

我想限制用户使用任何enumvalue。如果用户尝试分配两个以上的值,我必须抛出错误。

public enum Fruits
{
    Apple,
    Orange,
    Grapes
}

public Fruits Fruits
{
    get
    {
        return m_fruits;
    }
    set
    {
        m_fruits=value;
    }
}

Fruits = Fruits.Apple & Fruits.Grapes; //I need to avoid such type of assignment

任何人都可以说如何检查此类验证。

谢谢, LOKESH

4 个答案:

答案 0 :(得分:9)

您可以使用Enum.IsDefined查看是否为枚举实际定义了整数值。为了能够检测到没有使用Fruits.Apple | Fruits.Grapes之类的逻辑操作,请确保您的枚举值是标志。

public enum Fruits
{
    Apple = 1,
    Orange = 2,
    Grapes = 4
}

public Fruits Fruit
{
    get
    {
        return m_fruits;
    }
    set
    {
        if (!Enum.IsDefined(typeof(Fruits), value))
        {
            throw new ArgumentException();
        }
        m_fruits = value;
    }
}

<强>更新

没有反射的更快的方法是自己检查所有枚举值:

public Fruits Fruit
{
    get
    {
        return m_fruits;
    }
    set
    {
        switch (value)
        {
            case Fruits.Apple:
            case Fruits.Grapes:
            case Fruits.Orange:
                m_fruits = value;
                break;
            default:
                throw new ArgumentException();
        }
    }
}

答案 1 :(得分:5)

您可以使用Enum.IsDefined()方法检查值是否为有效的枚举值:

Fruits f1 = Fruits.Orange;
Fruits f2 = (Fruits)77;

var b1 = Enum.IsDefined(typeof(Fruits), f1); // => true
var b2 = Enum.IsDefined(typeof(Fruits), f2); // => false

BTW:您的示例似乎不正确:var f = Fruits.Apple&Fruits.Grapes会将Fruits.Apple分配给f。这是因为Apple(== 0)和Grapes(== 2)的按位AND将导致0(仍然是有效的枚举值 - &gt; Apple)。

如果您的意思是var f = Fruits.Orange|Fruits.Grapes,那么f现在将 3 (按位OR为1和2),Enum.IsDefined现在将返回false。

答案 2 :(得分:1)

这是一个按位操作,只能与[Flags]属性一起使用,当你的枚举值明确适用于标志时(例如1,2,4,8,16)等等。)

答案 3 :(得分:0)

你不能限制它。唯一的方法是创建自定义类并使用实例创建静态字段(如Encoding)。顺便说一下,按位&amp;对于未标记为enum的{​​{1}}而言毫无意义。 [Flags]不会设置两个值(Fruits.Apple&Fruits.Grapes确实如此),它会产生毫无意义的结果:因为默认情况下枚举被映射到整数序列|会生成Fruits.Apple&Fruits.Grapes因为{{ 1}}映射到0