public static T DeepCopyByBin<T>(T obj)
{
object result;
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
//序列化成流
formatter.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
//反序列化成对象
result = formatter.Deserialize(stream);
stream.Close();
}
return (T)result;
}
第一种使用BinaryFormatter,还需要添加SerializableAttribute标记
第二种使用反射
public static T DeepCopy<T>(T obj)
{
if (obj is string)
{
return obj;
}
Type type = obj.GetType();
if (type.IsValueType)
{
return obj;
}
object result = Activator.CreateInstance(type);
FieldInfo[] fields = type.GetFields(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
foreach (FieldInfo field in fields)
{
field.SetValue(result, DeepCopy(field.GetValue(obj)));
}
return (T)result;
}