c# - 在泛型方法中将对象打包成基本类型
问题描述
我正在使用 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);
解决方案
您需要提供一个类型。反序列化器在反序列化时无法猜测它应该选择什么类型。将传入的泛型类型参数传递给 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);
}
推荐阅读
- reactjs - 带有 React 的 IdentityServer4
- php - 如何使用带有多个 OR 值的嵌套 if 语句的 switch 语句
- java - 将 pdfReader 转换为 byte[] - Itext Java
- ubuntu-18.04 - live migrate KVM VM 在 Ubuntu 中因 TCP 连接而失败
- android - FusedLocationProviderClient 不返回位置
- javascript - 点击后不显示粗体
- git - 如何查看我之前在哪个分支
- java - 如何在 JAVA 中将带有逗号分隔值的字符串作为函数参数传递
- php - php 类型转换和数组引用
- javascript - 为什么我无法从输入框中获取输入?