在進行實體轉換操作的時候如果需要在對兩個實體之間兩個屬性字段差不多相同的類要進行一個互相的轉換,我們要把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;
}