C# 如何设置枚举';s数值

C# 如何设置枚举';s数值,c#,reflection,enums,C#,Reflection,Enums,是否有方法设置枚举的基础值(例如,通过反射)? 如果设置值没有匹配的枚举条目,会发生什么 奖励:当枚举设置为“无效”值后,对使用枚举的人有什么影响 谢谢 编辑:(用例) 一个用例将用于测试目的。 假设您有一个协议,其中消息类型字段由枚举表示,在协议中作为字节传输。 现在,如果我想测试一些无效的消息类型字段值,即未定义的字段值,因此不是枚举的一部分,该怎么办 奖金2: 如果枚举类型是动态的而不是固定的,那么该强制转换看起来会是什么样子。例如,假设您得到一个枚举类型的对象,并希望将其基础值设置为1。

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

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

谢谢

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

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

我将尝试回答您的所有问题

给定的

public enum SomeEnum
{
    Bob,
    Blip
}

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

是的


如果集合没有匹配的枚举项,会发生什么 价值

没什么

myEnum = 3;

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

使用enum之后,对使用enum的人有什么影响 是否设置为“无效”值

同上

考虑

SomeEnum myEnum;
    
myEnum = (SomeEnum)1;
Console.WriteLine(myEnum);
    
myEnum = (SomeEnum)3;
Console.WriteLine(myEnum);
输出

Blip
3
Blip
ConsoleApp1.Program+SomeEnum
尽管您可以想象有人检查枚举的情况

var myEnum = (SomeEnum)3;

switch (myEnum)
{
    case SomeEnum.Bob:
       break;
    case SomeEnum.Blip:
       break;
    default:
       throw new ArgumentOutOfRangeException();
 }
在这种情况下,将抛出异常


现在,如果我想测试一些消息类型字段值,它们是 无效,aka未定义,因此不是枚举的一部分

你可以使用

返回一个布尔值,指示给定的整数值或其名称 作为字符串存在于指定的枚举中

示例

if(!Enum.IsDefined(SomeWeirdReflectedType, someValue))
  ...
var someEnumType = typeof(SomeEnum);

var asd = Enum.ToObject(someEnumType, 1);

Console.WriteLine(asd);
Console.WriteLine(asd.GetType());

如果枚举类型是动态的,则该强制转换会是什么样子 修理

可以在运行时使用“将整数转换为枚举值”

将指定的整数值转换为枚举成员

示例

if(!Enum.IsDefined(SomeWeirdReflectedType, someValue))
  ...
var someEnumType = typeof(SomeEnum);

var asd = Enum.ToObject(someEnumType, 1);

Console.WriteLine(asd);
Console.WriteLine(asd.GetType());
输出

Blip
3
Blip
ConsoleApp1.Program+SomeEnum

为什么要使用反射更改枚举的值?你能解释一下你试图处理的用例吗?是的。只需尝试将
int
强制转换为枚举类型,看看会发生什么。如果将其设置为类型未指定的值,会发生什么情况?嗯,一切都安排好了。如果允许的话,你的程序需要处理它happen@ChetanRanpariya:使用用例编辑。哇,太快了!最后一个问题:如果我有一个动态枚举,例如,我得到一个
IsEnum==true
的对象,该怎么办。那个类型转换看起来怎么样?@Wall-E我猜你所说的动态实际上是一个可为空的枚举?不,不是一个可为空的枚举。请参阅我的编辑,转述:假设您动态地确定了枚举类型(例如,通过反射)。如何将要设置的值强制转换为确定的(枚举)类型?也就是说,我无法编写
myEnum=(myEnum)3
,因为我事先不知道枚举类型,而是在运行时知道。