zoukankan      html  css  js  c++  java
  • c#深拷贝

    /// <summary>
            /// 对象拷贝
            /// </summary>
            /// <param name="obj">被复制对象</param>
            /// <returns>新对象</returns>
            private object CopyOjbect(object obj) {
                if (obj == null) {
                    return null;
                }
                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, CopyOjbect(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) {
                                try {
                                    object propertyValue = myProperty.GetValue(obj, null);
                                    if (propertyValue is ICloneable) {
                                        myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);
                                    }
                                    else {
                                        myProperty.SetValue(targetDeepCopyObj, CopyOjbect(propertyValue), null);
                                    }
                                }
                                catch (System.Exception ex) {
    
                                }
                            }
                        }
                    }
                }
                return targetDeepCopyObj;
            }
    

     下面是 StackOverflow 上的一个回答:

    public static T DeepClone<T>(T obj)
    {
     using (var ms = new MemoryStream())
     {
       var formatter = new BinaryFormatter();
       formatter.Serialize(ms, obj);
       ms.Position = 0;
     
       return (T) formatter.Deserialize(ms);
     }
    }
    

     Notes:

    Your class MUST be marked as [Serializable] in order for this to work.
    Your source file must include the following code:
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;


    仅供参考。
    I've seen a few different approaches to this, but I use a generic utility method as such:

  • 相关阅读:
    可变性编程 不可变性编程 可变性变量 不可变性变量 并发编程 命令式编程 函数式编程
    hashable
    优先采用面向表达式编程
    内存转储文件 Memory.dmp
    windows update 文件 路径
    tmp
    查询局域网内全部电脑IP和mac地址等信息
    iptraf 网卡 ip 端口 监控 netstat 关闭端口方法
    Error 99 connecting to 192.168.3.212:6379. Cannot assign requested address
    t
  • 原文地址:https://www.cnblogs.com/zeroone/p/5653836.html
Copyright © 2011-2022 走看看