【发布时间】:2019-12-11 23:22:11
【问题描述】:
我正在尝试编写一个方法,该方法将采用通用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);
}
}
这确实有效,但感觉有点像噱头。解决此问题的最佳方法是什么?
谢谢!
【问题讨论】:
-
这取决于对象的类型以及对象是否可以实际转换为目标类型
-
你的 string[] 不是一个列表,所以你不能把它转换成那个,你必须做类似
((string[])value).ToList()的事情。 JsonConvert 可以处理这个问题,因为它会查看字符串并尝试解析值。 -
但这显然行不通,因为
string[]和List<string>之间没有转换...随意使用GenericToStronglyTyped<IEnumerable<string>>或GenericToStronglyTyped<string[]>... v2 显然可以作为@987654338 工作@ 和T[]具有相同的 JSON 表示 -
您可能还想了解如何在 Dapper 库中完成对象映射,这是性能最好的库之一:github.com/StackExchange/Dapper
-
您可以尝试几种不同的方法。首先尝试
as强制转换,然后检查类型是否可转换(使用is IConvertible),然后尝试classic 强制转换(使用catch)。看看@ericlippert 对stackoverflow.com/questions/2139798/… 的回答(以及他博客上的链接)