c# 反射实现模型深拷贝

1.支持属性,不支持字段,支持复杂类型属性

2.泛型集合类支持List<T>与Dictionary<TKey,TValue>

3.如果发现有什么问题,希望大家可以多多指教

复制代码
     /// <summary>
        /// 模型深拷贝
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static object Clone(this object model)
        {
            var modelType = model.GetType();
            if (modelType.IsValueType)
            {
                return model;
            }
            if (modelType.Name == typeof(List<>).Name)
            {
                var genericType = modelType.GenericTypeArguments;
                var newObj = Activator.CreateInstance(genericType.FirstOrDefault());
                var newList = (IList)Activator.CreateInstance(modelType);
                foreach (var itemObj in (IList)model)
                {
                    newList.Add(itemObj.Clone());
                }
                return newList;
            }
            if (modelType.Name == typeof(Dictionary<,>).Name)
            {
                var genericType = modelType.GenericTypeArguments;
                var newkey = Activator.CreateInstance(genericType[0]);
                var newValue = Activator.CreateInstance(genericType[1]);
                var newDic = (IDictionary)Activator.CreateInstance(modelType);
                var modelDic = (IDictionary)model;
                foreach (var itemkey in (modelDic.Keys))
                {
                    newDic.Add(itemkey.Clone(), modelDic[itemkey].Clone());

                }
                return newDic;
            }
            var pros = modelType.GetProperties();
            var newModel = Activator.CreateInstance(modelType, true);
            var newModelType = newModel.GetType();
            var newpros = newModelType.GetProperties();
            foreach (var pro in pros)
            {
                var newPro = newpros.FirstOrDefault(u => u.Name == pro.Name);
                if (pro.PropertyType.IsValueType || pro.PropertyType == typeof(string))
                {
                    var value = pro.GetValue(model);
                    newPro.SetValue(newModel, value);
                }
                else
                {
                    var value = pro.GetValue(model);
                    var actobj = Activator.CreateInstance(newPro.PropertyType, true);
                    newPro.SetValue(newModel, value.Clone());
                }
            }
            return newModel;
        }
复制代码

 

posted @   六点钟苹果  阅读(1146)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示