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

Lok*_*esh 4 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以说如何检查这种类型的验证.

谢谢,Lokesh

Dir*_*mar 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


M4N*_*M4N 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
Run Code Online (Sandbox Code Playgroud)

顺便说一句:您的示例似乎不正确:var f = Fruits.Apple&Fruits.Grapes将分配Fruits.Applef.这是因为Apple(== 0)和Grapes(== 2)的按位AND将导致0(仍然是有效的枚举值 - > Apple).

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