C#深拷貝的實現
阿新 • • 發佈:2018-12-19
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; } }
兩種方法實現的深拷貝,