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

变更记录,是通过变更前是实体和变更后的实体进行比较后,如有变更记录,就记录到变更表里面。
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、变更记录表:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值