標籤:
/// <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:
c#深拷貝