【问题标题】:How to set an Enum's numeric value如何设置枚举的数值
【发布时间】:2020-12-09 05:02:15
【问题描述】:

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

奖励:将枚举设置为“无效”值后,对使用枚举的人会有什么影响?

谢谢!

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

奖励 2: 如果枚举类型是动态的而不是固定的,那么这种转换看起来会是什么样子。例如。假设您收到一个枚举类型对象并希望将其基础值设置为 1。

【问题讨论】:

  • 为什么要使用反射来改变枚举的值?您能解释一下您要处理的用例吗?
  • 是的。只需尝试将int 转换为枚举类型,看看会发生什么。而且,如果将其设置为类型未指定的值会发生什么?好吧,它设置好了。如果您允许这种情况发生,您的程序需要处理它
  • @ChetanRanpariya:用用例编辑。

标签: c# reflection enums


【解决方案1】:

我会尽量回答您的所有问题

给定

public enum SomeEnum
{
    Bob,
    Blip
}

有没有办法设置枚举的基础值

是的..

myEnum = (SomeEnum)1; ///  = Blip

如果集合中没有匹配的枚举条目会发生什么 价值?

没什么...

myEnum = 3;

If(myEnum == SomeEnum.Bob)
   // never gets hit

对使用枚举的人有什么影响 设置为“无效”值?

同上

考虑

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

【讨论】:

  • 哇,真快!最后一个问题:如果我有一个动态枚举怎么办,例如我得到一个带有IsEnum==true 的对象。演员阵容会是什么样子?
  • @Wall-E 我猜你所说的动态实际上是一个可为空的枚举?
  • 不,不是可以为空的。请参阅我的编辑,释义:假设您动态确定了枚举类型(例如通过反射)。如何将要设置的值转换为确定的(枚举)类型? Aka 我不能写 myEnum = (MyEnum) 3,因为我不知道 Enum Typ 先验 - 而是在运行时。
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 2016-08-20
  • 2021-08-23
相关资源
最近更新 更多