You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在未知元素泛型参数的情况下实现泛型List的浅拷贝?

List浅拷贝填充实现方案

首先你现有代码有两处逻辑错误需要先修正:

  • 泛型类型判断逻辑错误:source.GetType()返回的是构造完成的封闭泛型类型(比如List<int>),和开放泛型typeof(List<>)直接判等永远返回false,需要改用GetType().IsGenericType && GetType().GetGenericTypeDefinition() == typeof(List<>)的判断逻辑
  • 元素类型获取逻辑错误:listType.GetGenericArguments()[0]本身已经是列表元素的Type对象,无需再调用GetType(),否则会拿到System.Type本身的类型实例,导致后续构造泛型类型出错

浅拷贝填充逻辑非常简单,只需要遍历原列表的所有元素,逐个添加到新创建的克隆列表实例即可,值类型会直接复制值,引用类型仅复制引用指向,完全符合浅拷贝要求。你可以通过dynamic类型跳过编译期类型检查,直接调用列表的Add方法完成填充。

完整修正后的代码如下:

T Clone<T>(T source)
{
    if (source != null && source.GetType().IsGenericType 
        && source.GetType().GetGenericTypeDefinition() == typeof(List<>))
    {
        Type listType = source.GetType();
        // 获取列表元素类型
        Type listElemType = listType.GetGenericArguments()[0];
        // listType本身就是构造好的封闭泛型,直接创建实例即可
        var listClone = (T)Activator.CreateInstance(listType);
        // 转dynamic直接操作元素
        dynamic sourceList = source;
        dynamic targetList = listClone;
        foreach (var item in sourceList)
        {
            targetList.Add(item);
        }
        return listClone;
    }
    // 其他类型的克隆逻辑可在此扩展
    return default;
}

内容的提问来源于stack exchange,提问作者Gigi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 05:24:07