如何设置枚举的数值



有没有办法设置枚举的基础值(例如通过反射(?如果设置值没有匹配的枚举条目,会发生什么?

额外的好处:在枚举被设置为"之后,对使用它的人来说会有什么影响;无效";价值

谢谢!

编辑:(用例(一个用例将用于测试目的。假设您有一个协议,其中包含一个由枚举表示的消息类型字段,该字段在协议中以字节形式传输。现在,如果我想测试一些无效的消息类型字段值,也就是说,没有定义,因此不属于枚举的一部分,该怎么办。

奖金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

最新更新