using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
|
namespace iWare.Wms.Core
|
{
|
public class EntityPropHelper
|
{
|
/// <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;
|
}
|
|
}
|
/// <summary>
|
/// 用于属性属性赋值操作的帮助类
|
/// </summary>
|
/// <typeparam name="T">原对象类</typeparam>
|
/// <typeparam name="S">目标对象类</typeparam>
|
public class EntityPropHelper<T,S> where T:class where S:class
|
{
|
/// <summary>
|
/// 将t中的各个对于的属性值赋值到s中相应的属性
|
/// </summary>
|
/// <param name="t">原对象</param>
|
/// <param name="s">目标对象</param>
|
/// <param name="columnMap">以T中的属性名为键,S中的属性名为值的字典 t赋值给S</param>
|
public static void CopyProp(T t, S s, Dictionary<string,string> columnMap)
|
{
|
Type typeT = typeof(T);
|
Type typeS = typeof(S);
|
|
var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
|
var sPropDic = new Dictionary<string, PropertyInfo>();
|
|
var keys = columnMap.Keys;
|
var values = columnMap.Values;
|
|
//遍历S的所有属性,将符合修改的存入字典中
|
sProps.ForEach(p => { if (values.Contains(p.Name)) { sPropDic.Add(p.Name, p); } });
|
|
var tProps = typeT.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
|
var tPropDic = new Dictionary<string, PropertyInfo>();
|
|
//遍历S的所有属性,将符合修改的存入字典中
|
tProps.ForEach(p => { if (keys.Contains(p.Name)) { tPropDic.Add(p.Name, p); } });
|
|
foreach(var key in keys)
|
{
|
var propValue = tPropDic[key].GetValue(t, null);
|
sPropDic[columnMap[key]].SetValue(s, propValue, null);
|
}
|
|
}
|
|
|
/// <summary>
|
/// 将s中的各个对于的属性值赋值到t中相应的属性
|
/// </summary>
|
/// <param name="t">目标对象</param>
|
/// <param name="s">原对象</param>
|
/// <param name="columnMap">以T中的属性名为键,S中的属性名为值的字典 </param>
|
public static void CopyProp(S s,T t , Dictionary<string, string> columnMap)
|
{
|
|
|
Type typeT = typeof(T);
|
Type typeS = typeof(S);
|
|
var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
|
var sPropDic = new Dictionary<string, PropertyInfo>();
|
|
var keys = columnMap.Keys;
|
var values = columnMap.Values;
|
|
//遍历S的所有属性,将符合修改的存入字典中
|
sProps.ForEach(p => { if (values.Contains(p.Name)) { sPropDic.Add(p.Name, p); } });
|
|
var tProps = typeT.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
|
var tPropDic = new Dictionary<string, PropertyInfo>();
|
|
//遍历S的所有属性,将符合修改的存入字典中
|
tProps.ForEach(p => { if (keys.Contains(p.Name)) { tPropDic.Add(p.Name, p); } });
|
|
foreach (var key in keys)
|
{
|
var propValue = sPropDic[columnMap[key]].GetValue(s, null);
|
|
tPropDic[key].SetValue(t, propValue, null);
|
}
|
|
|
}
|
|
/// <summary>
|
/// 将t中的各个对于的属性值赋值到s中相应的属性
|
/// </summary>
|
/// <param name="t">原对象</param>
|
/// <param name="s">目标对象</param>
|
/// <param name="columnMap">以T中的属性名为键,S中的属性名为值的字典</param>
|
public static void CopyProp(T t, S s,List<string> propNames)
|
{
|
Type typeT = typeof(T);
|
Type typeS = typeof(S);
|
|
var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
|
var sPropDic = new Dictionary<string, PropertyInfo>();
|
|
|
//遍历S的所有属性,将符合修改的存入字典中
|
sProps.ForEach(p => { if (propNames.Contains(p.Name)) { sPropDic.Add(p.Name, p); } });
|
|
var tProps = typeT.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
|
var tPropDic = new Dictionary<string, PropertyInfo>();
|
|
//遍历S的所有属性,将符合修改的存入字典中
|
tProps.ForEach(p => { if (propNames.Contains(p.Name)) { tPropDic.Add(p.Name, p); } });
|
|
foreach (var propName in propNames)
|
{
|
var propValue = tPropDic[propName].GetValue(t, null);
|
sPropDic[propName].SetValue(s, propValue, null);
|
}
|
}
|
}
|
}
|