C#反射复制实体

通过反射,深度复制实体的副本

 public static T Clone<T>(T obj)
        {
            Type type = obj.GetType();
            //对于没有公共无参构造函数的类型此处会报错
            T returnObj = (T)Activator.CreateInstance(type);

            FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            if (fields!=null && fields.Length>0)
            {
                for (int i = 0; i < fields.Length; i++)
                {
                    FieldInfo field = fields[i];
                    var fieldValue = field.GetValue(obj);
                    ///值类型,字符串,枚举类型直接把值复制,不存在浅拷贝
                    if (fieldValue.GetType().IsValueType || fieldValue.GetType().Equals(typeof(System.String)) || fieldValue.GetType().IsEnum)
                    {
                        field.SetValue(returnObj, fieldValue);
                    }
                    else
                    {
                        field.SetValue(returnObj, Clone(fieldValue));
                    }
                }
            }

           
            //属性
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            if (properties!=null && properties.Length>0)
            {
                for (int i = 0; i < properties.Length; i++)
                {
                    PropertyInfo property = properties[i];
                    var propertyValue = property.GetValue(obj);
                    if (propertyValue.GetType().IsValueType || propertyValue.GetType().Equals(typeof(System.String)) || propertyValue.GetType().IsEnum)
                    {
                        property.SetValue(returnObj, propertyValue);
                    }
                    else
                    {
                        property.SetValue(returnObj, Clone(propertyValue));
                    }
                }
            }


            return returnObj;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值