/// <summary>
/// 通过反射创建对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="stance"></param>
/// <returns></returns>
public object CloneObject(object objsource)
{
//第一步获取原对象的类型,并创建一个同类型的对象
Type typesource = objsource.GetType();
object objTarget = Activator.CreateInstance(typesource);
//第二步获取原对象的所有属性
PropertyInfo[] propertyinfo = typesource.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
//第三步将原对象的所有属性赋给目标对象
foreach (PropertyInfo item in propertyinfo)
{
if (item.CanWrite)
{
//值类型,字符串,枚举类型直接把值复制,不存在浅拷贝 虽然字符串是引用类型,但是字符串是不可变的,每次都是创建新的字符串对象,所以不存在浅拷贝
if (item.PropertyType.IsEnum || item.PropertyType.IsValueType || item.PropertyType.Equals(typeof(System.String)))
{
item.SetValue(objTarget, item.GetValue(objsource, null), null);
}
else
{
object objpropertyvalue = item.GetValue(objsource, null);
item.SetValue(objTarget, CloneObject(objpropertyvalue), null);
}
}
}
return objTarget;
}
出处: 原文章