1. 程式人生 > >C#用反射實現兩個類的物件之間相同屬性的值的複製

C#用反射實現兩個類的物件之間相同屬性的值的複製

在進行實體轉換操作的時候如果需要在對兩個實體之間兩個屬性欄位差不多相同的類要進行一個互相的轉換,我們要把a物件的所有欄位的值都複製給b物件,我們只能用b.屬性=a.屬性來寫,如果屬性欄位太多的話,就要寫很多行復制語句,麻煩還容易漏掉一些,這個時候可以利用c#的反射來實現複製。我們可以寫這樣一個利用泛型的對映函式。

1.適用於建立實體的時候從一個實體作為資料來源賦值

        /// <summary>
        /// 反射實現兩個類的物件之間相同屬性的值的複製
        /// 適用於初始化新實體
        /// </summary>
        /// <typeparam name="D">返回的實體</typeparam>
        /// <typeparam name="S">資料來源實體</typeparam>
        /// <param name="s">資料來源實體</param>
        /// <returns>返回的新實體</returns>
        public static D Mapper<D, S>(S s)
        {
            D d = Activator.CreateInstance<D>(); //構造新例項
            try
            {
                var Types = s.GetType();//獲得型別  
                var Typed = typeof(D);
                foreach (PropertyInfo sp in Types.GetProperties())//獲得型別的屬性欄位  
                {
                    foreach (PropertyInfo dp in Typed.GetProperties())
                    {
                        if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name!= "Error" && dp.Name != "Item")//判斷屬性名是否相同  
                        {
                            dp.SetValue(d, sp.GetValue(s, null), null);//獲得s物件屬性的值複製給d物件的屬性  
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return d;
        }

 

2.適用於沒有建立實體,兩個實體之間資料的轉換

 

        /// <summary>
        /// 反射實現兩個類的物件之間相同屬性的值的複製
        /// 適用於沒有新建實體之間
        /// </summary>
        /// <typeparam name="D">返回的實體</typeparam>
        /// <typeparam name="S">資料來源實體</typeparam>
        /// <param name="d">返回的實體</param>
        /// <param name="s">資料來源實體</param>
        /// <returns></returns>
        public static D MapperToModel<D, S>(D d,S s)
        {
            try
            {
                var Types = s.GetType();//獲得型別  
                var Typed = typeof(D);
                foreach (PropertyInfo sp in Types.GetProperties())//獲得型別的屬性欄位  
                {
                    foreach (PropertyInfo dp in Typed.GetProperties())
                    {
                        if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name != "Error" && dp.Name != "Item")//判斷屬性名是否相同  
                        {
                            dp.SetValue(d, sp.GetValue(s, null), null);//獲得s物件屬性的值複製給d物件的屬性  
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return d;
        }