利用反射賦值引用類型對象(對象深拷貝)

/// <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;
        }

出處: 原文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章