正在使用Json.NET反序列化枚举值



我有一个从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。这就是为什么在第一种情形下我们得到数值,在第二种情形下得到枚举值。

相关内容

  • 没有找到相关文章

最新更新