using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace iWare_SCADA_BusinessLogical.Utils { public class EntityPropHelper { /// /// 反射实现两个类的对象之间相同属性的值的复制 /// 适用于初始化新实体 /// /// 返回的实体 /// 数据源实体 /// 数据源实体 /// 返回的新实体 public static D Mapper(S s) { D d = Activator.CreateInstance(); //构造新实例 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; } } /// /// 用于属性属性赋值操作的帮助类 /// /// 原对象类 /// 目标对象类 public class EntityPropHelper where T:class where S:class { /// /// 将t中的各个对于的属性值赋值到s中相应的属性 /// /// 原对象 /// 目标对象 /// 以T中的属性名为键,S中的属性名为值的字典 public static void CopyProp(T t, S s, Dictionary columnMap) { Type typeT = typeof(T); Type typeS = typeof(S); var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList(); var sPropDic = new Dictionary(); 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(); //遍历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); } } ///// ///// 将s中的各个对于的属性值赋值到t中相应的属性 ///// ///// 目标对象 ///// 原对象 ///// 以T中的属性名为键,S中的属性名为值的字典 //public static void CopyProp(S s,T t , Dictionary columnMap) //{ // Type typeT = typeof(T); // Type typeS = typeof(S); // var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList(); // var sPropDic = new Dictionary(); // 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(); // //遍历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); // } //} /// /// 将t中的各个对于的属性值赋值到s中相应的属性 /// /// 原对象 /// 目标对象 /// 以T中的属性名为键,S中的属性名为值的字典 public static void CopyProp(T t, S s,List propNames) { Type typeT = typeof(T); Type typeS = typeof(S); var sProps = typeS.GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList(); var sPropDic = new Dictionary(); //遍历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(); //遍历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); } } } }