利用序列化实现深拷贝(最靠谱,其他两种方法失效时这个实测可用)
public static T Clone<T>(T RealObject)
{
using (Stream objectStream = new MemoryStream())
{
//利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, RealObject);
objectStream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(objectStream);
}
}
利用反射实现深拷贝
public static T DeepCopyByReflection<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.Static|BindingFlags.Instance);
foreach(var field in fields)
{
try
{
field.SetValue(retval, DeepCopyByReflection(field.GetValue(obj)));
}
catch { }
}
return (T)retval;
}
List深拷贝:
List<HoriPoleData> lstHoriPoleSnap = new List<HoriPoleData>();
List<VertPoleData> lstVertPoleSnap = new List<VertPoleData>();
m_zdjCalcData.VertPoleDatas.ForEach(i => lstVertPoleSnap.Add(i));
m_zdjCalcData.HoriPoleDatas.ForEach(i => lstHoriPoleSnap.Add(i));