C#对象深拷贝方法

来源:互联网 发布:adc0808与单片机连接 编辑:程序博客网 时间:2024/05/16 12:58

对象的拷贝是编程中常用到的,下面提供一个对象深拷贝的方法,挺不错的

public object Copy(this object obj)        {            Object targetDeepCopyObj;            Type targetType = obj.GetType();            //值类型            if (targetType.IsValueType == true)            {                targetDeepCopyObj = obj;            }            //引用类型             else            {                targetDeepCopyObj = System.Activator.CreateInstance(targetType);   //创建引用对象                 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();                foreach (System.Reflection.MemberInfo member in memberCollection)                {                    if (member.MemberType == System.Reflection.MemberTypes.Field)                    {                        System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;                        Object fieldValue = field.GetValue(obj);                        if (fieldValue is ICloneable)                        {                            field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone());                        }                        else                        {                            field.SetValue(targetDeepCopyObj, Copy(fieldValue));                        }                    }                    else if (member.MemberType == System.Reflection.MemberTypes.Property)                    {                        System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;                        MethodInfo info = myProperty.GetSetMethod(false);                        if (info != null)                        {                            object propertyValue = myProperty.GetValue(obj, null);                            if (propertyValue is ICloneable)                            {                                myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);                            }                            else                            {                                myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null);                            }                        }                    }                }            }            return targetDeepCopyObj;        }