本文属于原创,转载时请标明出处!
折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天去想着物理的反射、折射怎么解。感谢少将哥哥给我的指点,经过一个晚上对反射的恶补,最终搞定了。纪念一下。
1.核心代码:
1 PRivate static void IsUpdate<T>(T old, T current, string id) 2 { 3 Model.PerFileHistory history = new Model.PerFileHistory(); 4 Model.Atrributes.ModifyFields atrr = null; 5 Type type = typeof(T); 6 PropertyInfo[] propertys = type.GetProperties(); 7 foreach (PropertyInfo property in propertys) 8 { 9 if (property.PropertyType.IsValueType || property.PropertyType.Name == "String")10 {11 if (property.PropertyType.FullName.Contains("Guid"))12 continue;13 //if (property.Name != "CreateUserID" && property.Name != "CreateTime" && property.Name != "ModifyUserID" && property.Name != "LastModifyTime")//排除这些字段不做判断14 //{15 if (property.GetCustomAttributes(typeof(Model.Atrributes.ModifyFields), false).Count() > 0)16 {17 object o1 = property.GetValue(old, null); //以前的值18 object o2 = property.GetValue(current, null); //修改后的值19 string str1 = o1 == null ? string.Empty : o1.ToString();20 string str2 = o2 == null ? string.Empty : o2.ToString();21 //判断两者是否相同,不同则插入历史表中22 if (str1 != str2)23 {24 history.BeforeValue = str1; //修改前的值25 history.AfterValue = str2; //修改后的值26 history.PCardNo = id; //修改数据的ID27 history.ipAddress = HanNeng.Common.GetClientIP.GetRealIP(); //获取当前用户的IP地址28 atrr = property.GetCustomAttributes(typeof(Model.Atrributes.ModifyFields), false)[0] as Model.Atrributes.ModifyFields;29 history.ModifyField = property.Name; //修改的字段名称30 history.ModifyFieldName = atrr.FieldsName; //修改的字段中文名称31 32 new BLL.PerFileHistory().AddModel(history);33 }34 }35 //}36 }37 }38 }View Code
2.获取字段中文名,这个是在Model的类名里设置,示例如下:
1 /// <summary> 2 /// 获取字段名称 3 /// </summary> 4 public class ModifyFields : Attribute 5 { 6 public ModifyFields() 7 { 8 } 9 public ModifyFields(string name)10 {11 this.FieldsName = name;12 }13 /// <summary>14 /// 修改的字段中文名15 /// </summary>16 public string FieldsName17 {18 get;19 set;20 }21 }Model
1 /// <summary>2 /// 科部3 /// </summary>4 [Atrributes.ModifyFields("科部")]5 public int? SubjectDep6 {7 set { _subjectdep = value; }8 get { return _subjectdep; }9 }Model类名示例
3.调用方式示例:
1 if (id != null) 2 { 3 Model.PersonFile Person = bllPerson.GetModel<Model.PersonFile>(id); 4 if (modelPerson != null) 5 { 6 Model.Identity identity = session["Identity"] as Model.Identity; 7 //if (identity.RoleIDs.ToString() == "R01") //如果是系统管理员,则不记录历史 8 //{ 9 //对前后数据的不同进行比较10 Model.PersonFile OldPerson = Person;11 Model.PersonFile NewPerson = modelPerson;12 NewPerson.PersonAutoID = OldPerson.PersonAutoID;13 IsUpdate(OldPerson, NewPerson, id);14 //}15 }16 }Controller.CS
4.最终的效果图:
新闻热点
疑难解答