我的代码是.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]]
1
Name = Nullable
这是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;
}
答案 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");
}
它同时适用于NetType
和NetType?
。
答案 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();