能够通过反射分配无效的枚举值

Ive*_*Ive 1 c# reflection enums

我通过反射设置枚举值时遇到了一些奇怪的行为.好像我能够为枚举设置一个无效的值:

class EnumReflector
{
    public enum MyEnum
    {
        Option1 = 0,
        Option2,
        Option3
    }

    public MyEnum TheEnum { get; set; }

    public void Test()
    {
        PropertyInfo pi = this.GetType().GetProperty("TheEnum");
        string badValue = "1234";
        object propertyValue = Enum.Parse(pi.PropertyType, badValue, true);

        pi.SetValue(this, propertyValue, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样称呼:

        EnumReflector e = new EnumReflector();
        e.Test();
        if (e.TheEnum == EnumReflector.MyEnum.Option1 ||
            e.TheEnum == EnumReflector.MyEnum.Option2 ||
            e.TheEnum == EnumReflector.MyEnum.Option3)
        {
            Console.WriteLine("Value is valid");
        }
        else
        {
            Console.WriteLine("Value is invalid: {0} ({1})", e.TheEnum.ToString(), (int)e.TheEnum);
        }
Run Code Online (Sandbox Code Playgroud)

输出是:

价值无效:1234(1234)

怎么会这样?我虽然枚举的本质之一就是限制价值!

Luc*_*ero 5

枚举只是整数(任何整数基本类型,可以指定)和一些已定义的命名常量.不需要反射来分配没有命名常量的值:

enum MyEnum {
    None, One, Two
}

MyEnum e = (MyEnum)100;
Run Code Online (Sandbox Code Playgroud)

编译并正常工作.请注意,这也是Enum.IsDefined()静态方法的原因,静态方法检查枚举值是否为定义的值.