我想限制用户使用任何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
答案 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