我有一个从JSON反序列化的JValue,这个值代表一个枚举。考虑以下两种情况:
JValue value = ...
object o1 = value.ToObject(typeof(MyEnum));
object o2 = value.ToObject<MyEnum>();
o1是integer类型,并保存枚举的数值
o2是enum类型,并保存枚举值
为什么ToObject方法在这两种情况下的工作方式不同?
假设MyEnum
看起来像这样:
public enum MyEnum
{
First = 1,
Second,
Third
}
并且CCD_ 2是这样定义的:
var value = new JValue(MyEnum.First);
当您拨打以下线路时:
object o1 = value.ToObject(typeof(MyEnum));
您正在调用ToObject
方法的非泛型重载。在枚举的情况下,此方法解析枚举的基础类型,在本例中为int
,并将对象强制转换为该值。这就是它返回数值的原因。(在这种情况下为1)。
当您调用ToObject
方法的通用重载时:
object o2 = value.ToObject<MyEnum>();
从JValue
获得结果,结果再次为1,但在返回值之前,它被强制转换为泛型类型参数的类型。
更清楚地说,以下是ToObject
方法的通用重载的样子:
public T ToObject<T>()
{
return (T)ToObject(typeof(T));
}
它调用非泛型重载(我们在第一种情况下使用了它),但在返回结果之前,它将结果强制转换为T
。这就是为什么在第一种情形下我们得到数值,在第二种情形下得到枚举值。