C# 将泛型对象转换为强类型对象
我正在尝试编写一个方法,该方法将接受一个泛型C# 将泛型对象转换为强类型对象,c#,.net,C#,.net,我正在尝试编写一个方法,该方法将接受一个泛型对象,并将其转换为T类型。上下文是,我刚刚进行了一个REST API调用,响应的内容在值中。在本例中,我碰巧知道返回类型是字符串数组 但当然,情况并非总是如此 using (var response = await client.SendAsync(request)) { HttpContent result = response.Content; object value = ((ObjectContent)result).Valu
对象
,并将其转换为T
类型。上下文是,我刚刚进行了一个REST API调用,响应的内容在值中。在本例中,我碰巧知道返回类型是字符串数组
但当然,情况并非总是如此
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);
}
这确实管用,但感觉有点像噱头。最好的办法是什么
谢谢
这确实管用,但感觉有点像噱头。最好的办法是什么
我觉得你在这里大胆提出自己的观点,但是,我的观点是:你所提出的作为噱头的解决方案经过了很好的测试,而且非常容易阅读。我一整天都要吃
如果在某一点上序列化的开销太大,那么请回来仔细查看。但是,尤其是当绕过严格的数据时,有太多的边缘情况需要考虑。这是一个已解决的问题,因此我建议您了解这些库的存在,并继续使用实际的业务逻辑
这确实管用,但感觉有点像噱头。最好的办法是什么
我觉得你在这里大胆提出自己的观点,但是,我的观点是:你所提出的作为噱头的解决方案经过了很好的测试,而且非常容易阅读。我一整天都要吃
如果在某一点上序列化的开销太大,那么请回来仔细查看。但是,尤其是当绕过严格的数据时,有太多的边缘情况需要考虑。这是一个已解决的问题,因此我建议您了解这些库的存在,并继续使用实际的业务逻辑。这取决于对象的类型,如果对象可以实际转换为目标类型,则字符串[]不是列表,因此您不能将其转换为列表,您必须执行类似于((字符串[])值)的操作.ToList()
。JsonConvert可以处理这个问题,因为它查看字符串并尝试解析值。但是这显然不起作用。string[]
和List
之间没有转换。。。请随意使用GenericToStronglyTyped
或GenericToStronglyTyped
。。。v2显然将作为List
工作,并且T[]
具有相同的JSON表示。您可能还想了解Dapper库中如何实现对象映射,这是性能最好的库之一:您可以尝试几种不同的方法。首先尝试as
转换,然后检查类型是否可转换(使用is IConvertible
),然后尝试经典转换(使用catch
)。看看@ericlippert的答案(以及他的博客上的链接),这取决于对象的类型,如果对象实际上可以转换为目标类型,那么字符串[]不是一个列表,因此您不能将其转换为列表,您必须执行类似于((string[])value.ToList()的操作。JsonConvert可以处理这个问题,因为它查看字符串并尝试解析值。但是这显然不起作用。string[]
和List
之间没有转换。。。请随意使用GenericToStronglyTyped
或GenericToStronglyTyped
。。。v2显然将作为List
工作,并且T[]
具有相同的JSON表示。您可能还想了解Dapper库中如何实现对象映射,这是性能最好的库之一:您可以尝试几种不同的方法。首先尝试as
转换,然后检查类型是否可转换(使用is IConvertible
),然后尝试经典转换(使用catch
)。看看@ericlippert对的回答(以及他的博客上的链接)
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);
}
}
private T GenericToStronglyTyped_v2<T>(object obj)
{
try
{
string json = JsonConvert.SerializeObject(obj);
return JsonConvert.DeserializeObject<T>(json);
}
catch (InvalidCastException)
{
return default(T);
}
}