有没有办法设置枚举的基础值(例如通过反射(?如果设置值没有匹配的枚举条目,会发生什么?
额外的好处:在枚举被设置为"之后,对使用它的人来说会有什么影响;无效";价值
谢谢!
编辑:(用例(一个用例将用于测试目的。假设您有一个协议,其中包含一个由枚举表示的消息类型字段,该字段在协议中以字节形式传输。现在,如果我想测试一些无效的消息类型字段值,也就是说,没有定义,因此不属于枚举的一部分,该怎么办。
奖金2:如果枚举类型是动态的而不是固定的,那么这个强制转换会是什么样子。例如,假设您收到一个枚举类型的对象,并希望将其基本值设置为1。
我将尝试回答所有问题
给定
public enum SomeEnum
{
Bob,
Blip
}
有没有办法设置枚举的基本值
是。。
myEnum = (SomeEnum)1; /// = Blip
如果集合没有匹配的枚举项会发生什么价值
什么都没有。。。
myEnum = 3;
If(myEnum == SomeEnum.Bob)
// never gets hit
使用枚举后,对用户有什么影响设置为"0";无效";价值
与上述相同
考虑
SomeEnum myEnum;
myEnum = (SomeEnum)1;
Console.WriteLine(myEnum);
myEnum = (SomeEnum)3;
Console.WriteLine(myEnum);
输出
Blip
3
尽管你可以想象一种情况,有人范围检查枚举
var myEnum = (SomeEnum)3;
switch (myEnum)
{
case SomeEnum.Bob:
break;
case SomeEnum.Blip:
break;
default:
throw new ArgumentOutOfRangeException();
}
在这种情况下,异常将被抛出
现在,如果我想测试一些消息类型字段值无效,又称未定义,因此不属于枚举的一部分。
您可以使用Enum.IsDefined Method
返回一个布尔值,告诉给定的整数值或其名称作为字符串存在于指定的枚举中。
示例
if(!Enum.IsDefined(SomeWeirdReflectedType, someValue))
...
如果枚举类型是动态的,那么转换会是什么样子到固定
您可以在运行时使用Enum.ToObject
将整数转换为枚举值
将指定的整数值转换为枚举成员。
示例
var someEnumType = typeof(SomeEnum);
var asd = Enum.ToObject(someEnumType, 1);
Console.WriteLine(asd);
Console.WriteLine(asd.GetType());
输出
Blip
ConsoleApp1.Program+SomeEnum