使用通用方法将对象打包成基本类型

时间:2018-11-16 18:56:45

标签: c# deserialization

我正在使用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” content 变量)时,对象的内部类型很长,我无法直接从对象转换为 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);

1 个答案:

答案 0 :(得分:2)

您需要提供一种类型。反序列化器无法猜测反序列化时应从哪种类型中选择。将传入的泛型类型参数传递给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);
}