IsEnum无法识别枚举

时间:2018-08-22 14:45:19

标签: c# .net reflection enums

我的代码是.Net 4.0,我试图了解我现在使用的一些旧代码。我目前无法更改它,并且我确定这段代码在我之前就可以使用。它需要根据enum制作一个strings,但是该类型未被识别为enum


编辑

我现在意识到enum属性实际上是nullable。所以它是NetType吗?如果有值,如何将其转换为enum

当我调试并查看正在enum上检查的类型时,这就是我看到的:

  

FullName = System.Nullable 1[[AppName.Model.NetType, AppName.Model, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]
Name = Nullable
1

这是enum

public enum NetType
{
    ChoiceOne = 1,
    ChoiceTwo = 2
}

主代码,为清楚起见进行了简化:

var property = typeof(MainClass).GetProperty("NetType");
var value = GetValue(property.PropertyType, "ChoiceOne");

private object GetValue(Type type, string valueString)
{
     if (type.IsEnum)// Why false?
         return Enum.Parse(type, valueString);

     if (type == typeof (Int32))
         return Int32.Parse(valueString);

     return valueString;
 }

2 个答案:

答案 0 :(得分:0)

尝试一下:

var type = property.PropertyType;
object value;
if (type.IsEnum)
{
    value = GetValue(type, "ChoiceOne");
}
else if (type.IsGenericType &&
    type.GetGenericTypeDefinition() == typeof(Nullable<>) &&
    type.GetGenericArguments()[0].IsEnum)
{
    value = GetValue(type.GetGenericArguments()[0], "ChoiceOne");
}

它同时适用于NetTypeNetType?

答案 1 :(得分:0)

另一种选择是使用Nullable.GetUnderlyingType()首先检查它是否为可为空的枚举。如果是,请使用基础枚举;如果不是,请照常进行检查。

private object GetValue(Type type, string valueString)
{
    // If Nullable.GetUnderlyingType() returns null, it's not nullable
    // and you can default to type.
    var enumCandidiate = Nullable.GetUnderlyingType(type) ?? type;

    if (enumCandidiate.IsEnum)
        return Enum.Parse(enumCandidiate, valueString);

     if (type == typeof (Int32))
         return Int32.Parse(valueString);

     return valueString;
}

这是我的测试脚本(使用RoslynPad,因此使用了Dump()调用)。

var val = GetValue(typeof(NetType), "ChoiceOne");
val.Dump();

val = GetValue(typeof(NetType?), "ChoiceOne");
val.Dump();