如何在未知元素泛型参数的情况下实现泛型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
相关产品推荐
相关产品推荐

