解析为Nullable Enum

Val*_*mas 10 .net c# reflection enums nullable

我试图将字符串解析回MyEnum类型的可空属性.

public MyEnum? MyEnumProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

我在网上收到错误:

Enum result = Enum.Parse(t, "One") as Enum;
// Type provided must be an Enum. Parameter name: enumType
Run Code Online (Sandbox Code Playgroud)

我在下面有一个示例控制台测试.如果我删除属性上的nullable代码MyEntity.MyEnumProperty.

除了通过反射之外,如何在不知道typeOf枚举的情况下使代码工作?

static void Main(string[] args)
    {
        MyEntity e = new MyEntity();
        Type type = e.GetType();
        PropertyInfo myEnumPropertyInfo = type.GetProperty("MyEnumProperty");

        Type t = myEnumPropertyInfo.PropertyType;
        Enum result = Enum.Parse(t, "One") as Enum;

        Console.WriteLine("result != null : {0}", result != null);
        Console.ReadKey();
    }

    public class MyEntity
    {
        public MyEnum? MyEnumProperty { get; set; }
    }

    public enum MyEnum
    {
        One,
        Two
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ton 15

添加一个特殊情况Nullable<T>将工作:

Type t = myEnumPropertyInfo.PropertyType;
if (t.GetGenericTypeDefinition() == typeof(Nullable<>))
{
    t = t.GetGenericArguments().First();
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是从2012年开始的,但是对于任何偶然发现相同问题的人(如我)-略有改进:在t.GetGenericTypeDefinition()== ...之前添加对t.IsGenericType的检查,否则代码可能会中断不可为空的枚举类型 (2认同)