在進行實體轉換操做的時候若是須要在對兩個實體之間兩個屬性字段差很少相同的類要進行一個互相的轉換,咱們要把a對象的全部字段的值都複製給b對象,咱們只能用b.屬性=a.屬性來寫,若是屬性字段太多的話,就要寫不少行復制語句,麻煩還容易漏掉一些,這個時候能夠利用c#的反射來實現複製。咱們能夠寫這樣一個利用泛型的映射函數。c#
1.適用於建立實體的時候從一個實體做爲數據源賦值app
/// <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; }