c# - 将泛型对象转换为强类型 T

标签 c# .net

我正在尝试编写一个方法,该方法将采用通用对象并将其转换为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 因为:

Object must implement IConvertible.

所以我想出了自己的解决方案:

private T GenericToStronglyTyped_v2<T>(object obj)
{            
    try
    {
        string json = JsonConvert.SerializeObject(obj);
        return JsonConvert.DeserializeObject<T>(json);
    }
    catch (InvalidCastException)
    {
        return default(T);
    }
}

这确实有效,但感觉有点像个噱头。解决这个问题的最佳方法是什么?

谢谢!

最佳答案

That DOES work, but it feels like a bit of a gimmick. What is the best way to go about this?

我觉得你在这里冒险发表意见,但是,这是我的:你提出的解决方案是花哨的,既经过了良好的测试,又非常容易阅读。我会整天拿着它们。

如果在某些时候序列化开销太大,那么请返回并仔细查看。但尤其是在分流字符串数据时,需要考虑太多的边缘情况。这是一个已解决的问题,因此我建议您欣赏这些库的存在,并继续讨论您的实际业务逻辑。

关于c# - 将泛型对象转换为强类型 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59295590/

相关文章:

.net - 你能将 return 转入 IList<T> 吗?

c# - 处理控件自动相互更新的最佳方法?

c# - OrderBy [ Descending ]() 和 SkipWhile() 的意外行为

c# - 访问其他类变量

c# - Dataview Table.Rows.Count 在没有这样的行时返回 1

c# - 如何处理可能需要很长时间才能启动的启动/停止API接口(interface)

.net - 为什么我无法查询其他用户的 2FA 注册详细信息?

c# - ItemsControl 中的 ScrollViewer - ScrollBar 未显示但有效

c# - 如果方法对引用类型执行操作,是否需要返回它?

c#如何检测文件中的多个空格