1. 程式人生 > >C#深拷貝的實現

C#深拷貝的實現

public class IOHelper
{

        private IOHelper(){}
         /// <summary>
        /// 深拷貝,通過序列化與反序列化實現
        /// </summary>
        /// <typeparam name="T">深拷貝的類型別</typeparam>
        /// <param name="obj">深拷貝的類物件</param>
        /// <returns></returns>
        public static T DeepCopyByBin<T>(T obj)
        {
            object retval;
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                //序列化成流
                bf.Serialize(ms, obj);
                ms.Seek(0, SeekOrigin.Begin);
                //反序列化成物件
                retval = bf.Deserialize(ms);
                ms.Close();
            }
            return (T)retval;
        }

        /// <summary>
        /// 深拷貝,通過反射實現
        /// </summary>
        /// <typeparam name="T">深拷貝的類型別</typeparam>
        /// <param name="obj">深拷貝的類物件</param>
        /// <returns></returns>
        public static T DeepCopyByReflect<T>(T obj)
        {
            //如果是字串或值型別則直接返回
            if (obj is string || obj.GetType().IsValueType) return obj;

            object retval = Activator.CreateInstance(obj.GetType());
            FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
            foreach (FieldInfo field in fields)
            {
                try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
                catch { }
            }
            return (T)retval;
        }
}

兩種方法實現的深拷貝,