/// <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;
}
出處: 原文章