将通用对象转换为强类型的T

时间:2019-12-11 23:22:11

标签: c# .net

我正在尝试编写一个将采用通用object并将其转换为T类型的方法。上下文是,我刚刚进行了REST API调用,并且在value中有响应的内容。在这种情况下,我碰巧知道返回类型是一个字符串数组。

enter image description here

但是,当然并非总是如此。

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

确实可以,但是感觉有点like头。最好的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

确实可以,但是感觉有点like头。最好的方法是什么?

我觉得您在这里大胆尝试,但是,这是我的:您提出的花哨的解决方案经过了充分的测试,而且非常易于阅读。我会整天吃这些。

如果在某些时候序列化的开销太大,请回来仔细看看。但是,尤其是在分流字符串数据时,要考虑的边缘情况太多了。这是一个已解决的问题,所以我建议您了解那些库的存在,然后继续进行实际的业务逻辑。