c# - 将泛型对象转换为强类型 T
问题描述
我正在尝试编写一种方法,该方法将采用泛型object
并将其转换为T
. 上下文是,我刚刚进行了一个 REST API 调用,并且我在value
. 在这种情况下,我碰巧知道返回类型是一个字符串数组。
但当然,情况并非总是如此。
using (var response = await client.SendAsync(request))
{
HttpContent result = response.Content;
object value = ((ObjectContent)result).Value;
List<string> list = GenericToStronglyTyped<List<string>>(value);
List<string> list2 = GenericToStronglyTyped_v2<List<string>>(value);
}
我在这里发现了一个类似的问题,似乎是积极的: Cast object to T
我尝试了如下建议的答案:
private T GenericToStronglyTyped<T>(object obj)
{
if (obj is T)
{
return (T)obj;
}
try
{
return (T)Convert.ChangeType(obj, typeof(T));
}
catch (InvalidCastException)
{
return default(T);
}
}
但是,这会返回,null
因为:
对象必须实现 IConvertible。
所以我想出了自己的解决方案:
private T GenericToStronglyTyped_v2<T>(object obj)
{
try
{
string json = JsonConvert.SerializeObject(obj);
return JsonConvert.DeserializeObject<T>(json);
}
catch (InvalidCastException)
{
return default(T);
}
}
这确实有效,但感觉有点像噱头。解决此问题的最佳方法是什么?
谢谢!
解决方案
这确实有效,但感觉有点像噱头。解决此问题的最佳方法是什么?
我觉得您在这里冒险发表意见,但是,这是我的:您提出的花哨的解决方案既经过充分测试,又非常易于阅读。我会整天拿这些。
如果在某些时候序列化的开销太大,那么回来仔细看看。但尤其是在分流字符串数据时,需要考虑的边缘情况太多了。这是一个已解决的问题,因此我建议您了解这些库的存在并继续您的实际业务逻辑。
推荐阅读
- bash - 在 Bash 中调用算术展开运算符时如何使用乘法和除法?
- python - 仅使用 Python 在数据框中保留某些列
- electron - 有什么方法可以重新路由 Electron 的默认文件?
- html - 背景图像被剪切而不是缩小
- matlab - 为 3D 图形添加完整的 6 个边框
- mongodb - mongodb updateMany 查询过滤和更新竞争条件?
- regex - 仅使用正则表达式从 long strong 中检索第 12 到第 14 个字符 - Grafana 变量
- swift - 在弹出页面中关闭警报视图控制器
- vba - Microsoft 项目中的 Timescaledata 使用 VBA 提取资源使用数据
- ios - 如何在 SwiftUI 中添加键盘工具栏,即使在键盘不可见时仍保留