首页 > 解决方案 > 在泛型方法中将对象打包成基本类型

问题描述

我正在使用 Newtonsoft.JSON 库以通用方法序列化和反序列化对象。问题是基本类型的解析方式不同。

public T? GetKey<T>(string key) where T : struct
{
    string content = CrossSettings.Current.GetValueOrDefault(key, null);
    if (content == null)
        return null;
    object o = Newtonsoft.Json.JsonConvert.DeserializeObject(content);
    T v = (T)o;
    return v;
}

当存储的值为“1”内容变量)时,对象的内部类型是长的,我不能直接从对象转换为T=int (InvalidCastException)。propper 方法会先将对象转换为 long,然后再转换为 int,但由于它是泛型方法,我不知道结果类型是什么。
我也尝试过使用Activator.CreateInstance(o.GetType(), o);,但这再次返回对象。您对如何解决这个问题有任何想法吗?

编辑:简化问题

string content = "1";
object o = Newtonsoft.Json.JsonConvert.DeserializeObject(content);
int v = /* ??? */;
Debug.Assert(v == 1);

标签: c#deserialization

解决方案


您需要提供一个类型。反序列化器在反序列化时无法猜测它应该选择什么类型。将传入的泛型类型参数传递给 DeserializeObject 方法。

public T? GetKey<T>(string key) where T : struct
{
    string content = CrossSettings.Current.GetValueOrDefault(key, null);
    if (content == null)
        return null;
    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(content);
}

推荐阅读