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);
    }
}