反射+序列化+泛型=变更记录实例

来源:互联网 发布:mac拷贝视频到iphone 编辑:程序博客网 时间:2024/06/05 10:32

变更记录,是通过变更前是实体和变更后的实体进行比较后,如有变更记录,就记录到变更表里面。
1、序列化实体:
1)需要在.net framework 4.0:右击MODel层选择属性。
这里写图片描述
2)添加引用:
这里写图片描述
3)实体类代码设置:
这里写图片描述
注意: [Display(Name = “人员ID”)]是为了记录变更字段的中文名称。
2,核心代码两个实体进行比较,用泛型实体记录变更的每个字段,然后保存到变更表。:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;using System.ComponentModel.DataAnnotations;namespace Tlw.zjxypj.Common{    public static class ChangeRecordUnity    {        /// <summary>        /// 获取修改后的model,获取现在的model,对比model,获得差异        /// </summary>        /// <param name="modelAfter"></param>        /// <param name="modelBefore"></param>        /// <remarks>比对必须是相同的实体类</remarks>        public static List<ChangeInfo> getChanges(object modelAfter, object modelBefore)        {            List<ChangeInfo> lisChangeInfos = new List<ChangeInfo>();            Type t = modelAfter.GetType();            PropertyInfo[] pInfoArr = t.GetProperties();            //Dictionary<string, string> dicChangeList = new Dictionary<string, string>();            foreach (PropertyInfo pi in pInfoArr)  //遍历值            {                object objAfter = pi.GetValue(modelAfter, null);//修改后值                object objBefore = pi.GetValue(modelBefore, null);//修改前值                string pValueAfter = objAfter != null ? objAfter.ToString().Trim() : "";//修改后值                string pValueBefore = objBefore != null ? objBefore.ToString().Trim() : "";//修改前值                if (pValueAfter != pValueBefore)  //比对                {                    //获取修改信息                    string aliasName = "";                    object[] pAttribute = pi.GetCustomAttributes(typeof(DisplayAttribute), false);                    if (pAttribute.Count() > 0)                    {                        aliasName = ((DisplayAttribute)pAttribute[0]).Name;                    }                    //dicChangeList.Add(pi.Name,string.Format("{0} 从'{1}'更改为'{2}'",string.IsNullOrEmpty(aliasName)?pi.Name:aliasName,pValueBefore,pValueAfter));                    ChangeInfo pChangeInfo = new ChangeInfo();                    pChangeInfo.ColumnName = pi.Name;                    pChangeInfo.ColumnAliasName = string.IsNullOrEmpty(aliasName) ? pi.Name : aliasName;//变更小类:具体字段的中文名称                    pChangeInfo.AfterValue = pValueAfter;                    pChangeInfo.BeforeValue = pValueBefore;                    lisChangeInfos.Add(pChangeInfo);                }            }            //return dicChangeList;            return lisChangeInfos;        }    }    /// <summary>    /// 变更信息    /// </summary>    public class ChangeInfo    {        /// <summary>        /// 变更字段        /// </summary>        //        //变更小类:具体字段名称        public string ColumnName { get; set; }        //变更小类:具体字段的中文名称        public string ColumnAliasName { get; set; }        //变更后        public string AfterValue { get; set; }        //变更前        public string BeforeValue { get; set; }    }   }

3、调用:

//获取详细改变信息                List<ChangeInfo> lisChangeInfos = ChangeRecordUnity.getChanges(model, modelBefore);                if (lisChangeInfos.Count > 0)                {                    for (int i = 0; i < lisChangeInfos.Count; i++)                    {                        zjbaksys.Model.CHANGELOG pModel = new zjbaksys.Model.CHANGELOG();                        pModel.ID = DbHelperOra.GetSEQ("SEQ_CHANGELOG");                        pModel.APPCHECKID = decimal.Parse(pCheckid);                        pModel.ENTERPRISEID = ENTERPRISEID;                        pModel.TYPE = "技术负责人信息";                        pModel.SUBTYPE = lisChangeInfos[i].ColumnName;                        pModel.SUBALIASNAME = lisChangeInfos[i].ColumnAliasName;                        pModel.AFTERVALUE = lisChangeInfos[i].AfterValue;                        pModel.BEFOREVALUE = lisChangeInfos[i].BeforeValue;                        pModel.OPERATION = "修改";                        pModel.UNIQUENAME = modelBefore.PERSONNAME.Trim();                        pModel.SUBMITTIME = System.DateTime.Now;                        listLog.Add(pModel);                    }                }

4、变更记录表:
这里写图片描述

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 招工表填写和实际的有误怎么办 招工时档案年龄有人为改动怎么办 8个月宝贝还不会坐怎么办 朗动导航黑屏过了保修期怎么办 平板突然黑屏开不了机了怎么办 苹果ipad锁屏密码忘了怎么办 公司发资以两张工资表怎么办 面试谈好的工资结果发少了怎么办 老板面试没谈薪资让等电话怎么办 土地局把我的档案弄丢了怎么办 人事关系在医院不去上班怎么办 档案年龄多处涂改无法退休怎么办 个人办理退休原始档案丢了怎么办 在钢厂工作想辞职了怎么办呢 场地合同到期了公司不续签怎么办 应届生没毕业找到工作怎么办入职 公司工资保密同事要看工资条怎么办 考上特岗教师后和老公异地怎么办 档案在无档案保管权限的公司怎么办 辞职了户口迁回农原籍不接收怎么办 当正职直接指挥下级副职领导怎么办 单位申报个税身份证号码填错怎么办 申报个税身份证号码填错了怎么办 办了人事代理联系函商调函怎么办 劳务公司与分包工头算账成怎么办 客户退保业务员己得保险佣金怎么办 投了简历公司打来电话没接到怎么办 跟老板要工资她说过几天怎么办 公路车弯把手小抓不到刹车怎么办 新手骑电动车上路车子一直晃怎么办 不知情收赃东西已经卖了怎么办 档案和派遣证不在同一个地方怎么办 档案缺招工表和派遣证怎么办退休 开发商对接的银行利息比较高怎么办 工作未满一年离职转正定级怎么办 被网络骗贷翻到几十万怎么办 面试通过后迟迟不通知入职怎么办 厂里捡到饭卡花了里面的钱怎么办 上班用自己手机打卡没电怎么办 逸尚考勤机显示超出考勤记录怎么办 下雨穿套裙工装上班好冷怎么办