对于实现任意对象的Clone,以前也看到过不少讨论 的文章和实现。暂时先发到首页,供大家讨论,如果觉得不合适我会拆下
以下是Whizzo's 的两篇文章:
Object Cloning Using IL in C#
这篇文章作者分别用IL,反射实现了浅拷贝,并对普通的clone、IL、反射这三种实现方式做性能的对比
Object Deep Cloning using IL in C# - version 1.0
这篇文章作者分别用IL,反射实现了浅拷贝和深拷贝,并对普通的clone、IL深拷贝、IL浅拷贝、反射这三种实现方式做性能的对比,
目前只支持Colone的对象具有默认构造函数的对象。
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzUvMC80LzYvMjgvOTMxMGU4NWExNGFmOTlkZTQ4MTFmZjRjNzdmMWY5MTEuanBl.jpe?w=700&webp=1)
Code
using System;
using System.Collections.Generic;
using System.Text;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzMvOC83LzUvOTAvNzMxNjU1OTU0YzdiZTlkODgzNWVjZTU1MWI1Mzg1ZjguanBl.jpe?w=700&webp=1)
namespace Cloning
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvNC83LzIvMzEvMjRhOTI0YTU3YmE2YjNmMmI1MWZjOWVkYjdlYTQxODYuanBl.jpe?w=700&webp=1)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzUvMC80LzYvMjgvOTMxMGU4NWExNGFmOTlkZTQ4MTFmZjRjNzdmMWY5MTEuanBl.jpe?w=700&webp=1)
{
public class Person
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
private int _id;
private string _name;
private string _firstName;
private string _field1, _field2, _field3;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public Person()
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
this.Addresses = new List<Address>();
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public int ID
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _id; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _id = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public string Name
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _name; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _name = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public string FirstName
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _firstName; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _firstName = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private Address _address;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public Address Address
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _address; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _address = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private List<Address> _addresses;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public List<Address> Addresses
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _addresses; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _addresses = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public class Address
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
public Address()
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
this.AddressID = -1;
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public Address(int aid)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
this.AddressID = aid;
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private int _addressID;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public int AddressID
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _addressID; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _addressID = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private string _street;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public string Street
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _street; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _street = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private string _city;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public string City
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
get
{ return _city; }
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
set
{ _city = value; }
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
}
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzMvOC83LzUvOTAvNzMxNjU1OTU0YzdiZTlkODgzNWVjZTU1MWI1Mzg1ZjguanBl.jpe?w=700&webp=1)
Clone类
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzUvMC80LzYvMjgvOTMxMGU4NWExNGFmOTlkZTQ4MTFmZjRjNzdmMWY5MTEuanBl.jpe?w=700&webp=1)
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
using System.Collections;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzMvOC83LzUvOTAvNzMxNjU1OTU0YzdiZTlkODgzNWVjZTU1MWI1Mzg1ZjguanBl.jpe?w=700&webp=1)
namespace Cloning
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvNC83LzIvMzEvMjRhOTI0YTU3YmE2YjNmMmI1MWZjOWVkYjdlYTQxODYuanBl.jpe?w=700&webp=1)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzUvMC80LzYvMjgvOTMxMGU4NWExNGFmOTlkZTQ4MTFmZjRjNzdmMWY5MTEuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
/**//// <summary>
/// Delegate handler that's used to compile the IL to.
/// (This delegate is standard in .net 3.5)
/// </summary>
/// <typeparam name="T1">Parameter Type</typeparam>
/// <typeparam name="TResult">Return Type</typeparam>
/// <param name="arg1">Argument</param>
/// <returns>Result</returns>
public delegate TResult Func<T1, TResult>(T1 arg1);
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public class Cloning
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
/**//// <summary>
/// This dictionary caches the delegates for each 'to-clone' type.
/// </summary>
private static Dictionary<Type, Delegate> _cachedIL = new Dictionary<Type, Delegate>();
private static Dictionary<Type, Delegate> _cachedILDeep = new Dictionary<Type, Delegate>();
private LocalBuilder _lbfTemp;
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
/**//// <summary>
/// Clone one person object with reflection
/// </summary>
/// <param name="p">Person to clone</param>
/// <returns>Cloned person</returns>
public static Person CloneObjectWithReflection(Person p)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
FieldInfo[] fis = p.GetType().GetFields(System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic);
Person newPerson = new Person();
foreach (FieldInfo fi in fis)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
fi.SetValue(newPerson, fi.GetValue(p));
}
return newPerson;
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
/**//// <summary>
/// Clone a person object by manually typing the copy statements.
/// </summary>
/// <param name="p">Object to clone</param>
/// <returns>Cloned object</returns>
public static Person CloneNormal(Person p)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
Person newPerson = new Person();
newPerson.ID = p.ID;
newPerson.Name = p.Name;
newPerson.FirstName = p.FirstName;
newPerson.Address = new Address();
newPerson.Address.AddressID = p.Address.AddressID;
newPerson.Address.City = p.Address.City;
newPerson.Address.Street = p.Address.Street;
if(newPerson.Addresses!=null)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
newPerson.Addresses = new List<Address>();
foreach (Address a in newPerson.Addresses)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
newPerson.Addresses.Add(a);
}
}
return newPerson;
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
/**//// <summary>
/// Generic cloning method that clones an object using IL.
/// Only the first call of a certain type will hold back performance.
/// After the first call, the compiled IL is executed.
/// </summary>
/// <typeparam name="T">Type of object to clone</typeparam>
/// <param name="myObject">Object to clone</param>
/// <returns>Cloned object</returns>
public static T CloneObjectWithILShallow<T>(T myObject)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
Delegate myExec = null;
if (!_cachedIL.TryGetValue(typeof(T), out myExec))
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// Create ILGenerator (both DM declarations work)
// DynamicMethod dymMethod = new DynamicMethod("DoClone", typeof(T),
// new Type[] { typeof(T) }, true);
DynamicMethod dymMethod = new DynamicMethod("DoClone", typeof(T),
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
new Type[]
{ typeof(T) }, Assembly.GetExecutingAssembly().ManifestModule, true);
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
ConstructorInfo cInfo = myObject.GetType().GetConstructor(new Type[]
{ });
ILGenerator generator = dymMethod.GetILGenerator();
LocalBuilder lbf = generator.DeclareLocal(typeof(T));
generator.Emit(OpCodes.Newobj, cInfo);
generator.Emit(OpCodes.Stloc_0);
foreach (FieldInfo field in myObject.GetType().GetFields(
System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Public))
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, field);
generator.Emit(OpCodes.Stfld, field);
}
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Ret);
myExec = dymMethod.CreateDelegate(typeof(Func<T, T>));
_cachedIL.Add(typeof(T), myExec);
}
return ((Func<T, T>)myExec)(myObject);
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
public T CloneObjectWithILDeep<T>(T myObject)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
Delegate myExec = null;
if (!_cachedILDeep.TryGetValue(typeof(T), out myExec))
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// Create ILGenerator (both DM declarations work)
// DynamicMethod dymMethod = new DynamicMethod("DoClone", typeof(T),
// new Type[] { typeof(T) }, true);
DynamicMethod dymMethod = new DynamicMethod("DoClone", typeof(T),
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
new Type[]
{ typeof(T) }, Assembly.GetExecutingAssembly().ManifestModule, true);
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
ConstructorInfo cInfo = myObject.GetType().GetConstructor(new Type[]
{ });
ILGenerator generator = dymMethod.GetILGenerator();
LocalBuilder lbf = generator.DeclareLocal(typeof(T));
generator.Emit(OpCodes.Newobj, cInfo);
generator.Emit(OpCodes.Stloc_0);
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
foreach (FieldInfo field in typeof(T).GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public))
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
if (field.FieldType.IsValueType || field.FieldType == typeof(string))
CopyValueType(generator, field);
else if (field.FieldType.IsClass)
CopyReferenceType(generator, field);
}
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Ret);
myExec = dymMethod.CreateDelegate(typeof(Func<T, T>));
_cachedILDeep.Add(typeof(T), myExec);
}
return ((Func<T, T>)myExec)(myObject);
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private void CreateNewTempObject(ILGenerator generator, Type type)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
ConstructorInfo cInfo = type.GetConstructor(new Type[]
{ });
generator.Emit(OpCodes.Newobj, cInfo);
generator.Emit(OpCodes.Stloc, _lbfTemp);
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private void CopyValueType(ILGenerator generator, FieldInfo field)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, field);
generator.Emit(OpCodes.Stfld, field);
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private void CopyValueTypeTemp(ILGenerator generator, FieldInfo fieldParent, FieldInfo fieldDetail)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
generator.Emit(OpCodes.Ldloc_1);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, fieldParent);
generator.Emit(OpCodes.Ldfld, fieldDetail);
generator.Emit(OpCodes.Stfld, fieldDetail);
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private void PlaceNewTempObjInClone(ILGenerator generator, FieldInfo field)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// Get object from custom location and store it in right field of location 0
generator.Emit(OpCodes.Ldloc_0);
generator.Emit(OpCodes.Ldloc, _lbfTemp);
generator.Emit(OpCodes.Stfld, field);
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
private void CopyReferenceType(ILGenerator generator, FieldInfo field)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// We have a reference type.
_lbfTemp = generator.DeclareLocal(field.FieldType);
if (field.FieldType.GetInterface("IEnumerable") != null)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// We have a list type (generic).
if (field.FieldType.IsGenericType)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// Get argument of list type
Type argType = field.FieldType.GetGenericArguments()[0];
// Check that it has a constructor that accepts another IEnumerable.
Type genericType = Type.GetType("System.Collections.Generic.IEnumerable`1["
+ argType.FullName + "]");
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
ConstructorInfo ci = field.FieldType.GetConstructor(new Type[]
{ genericType });
if (ci != null)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// It has! (Like the List<> class)
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldfld, field);
generator.Emit(OpCodes.Newobj, ci);
generator.Emit(OpCodes.Stloc, _lbfTemp);
PlaceNewTempObjInClone(generator, field);
}
}
}
else
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
CreateNewTempObject(generator, field.FieldType);
PlaceNewTempObjInClone(generator, field);
foreach (FieldInfo fi in field.FieldType.GetFields(System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public))
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
if (fi.FieldType.IsValueType || fi.FieldType == typeof(string))
CopyValueTypeTemp(generator, field, fi);
else if (fi.FieldType.IsClass)
CopyReferenceType(generator, fi);
}
}
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvNi8zLzQvODEvMTQwOGM1MjYwYjJmMDVlNDUwZGVlOTI5ZGI5YmU1ZjcuanBl.jpe?w=700&webp=1)
}
}
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzMvOC83LzUvOTAvNzMxNjU1OTU0YzdiZTlkODgzNWVjZTU1MWI1Mzg1ZjguanBl.jpe?w=700&webp=1)
测试程序:
namespace
Cloning
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvNC83LzIvMzEvMjRhOTI0YTU3YmE2YjNmMmI1MWZjOWVkYjdlYTQxODYuanBl.jpe?w=700&webp=1)
{
class Program
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
static void Main(string[] args)
![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNC82LzIvNzYvNzE1ZjJkMDU1MDNiOTlkNDFmM2I2YmEyY2RjY2M4NGQuanBl.jpe?w=700&webp=1)
{
// Do some cloning tests![使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章 使用IL实现对象的Clone,浅拷贝,和深拷贝的几篇文章](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzIvMi80LzkvNzEvMjIyNTMwMTkwMTM2YzljNGNmZDIzN2NjMGQ1Y2ZmOTkuanBl.jpe?w=700&webp=1)
Cloning.TestCloning tc = new Cloning.TestCloning();
tc.DoTest();
}
}
}
还有一篇:Rick Minerich - A .NET Assembly for Cloning Objects with Arbitrary Field Value Changes: IcManipluator
Update 2008-12-26: