c#中实现监控类属性更改的代码案例分享

  介绍

小编给大家分享一下c#中实现监控类属性更改的代码案例分享,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

c#监控类属性的更改(大花猫动了哪些小玩具)

在使用EF更新数据库实体时。很多时候我们想要的只是更新表中的某一个或部分字段。虽然可以通过设置来告诉上下文我们要更新的字段。但是一般我们都会把数据持久层封装起来。通过泛型操作。而这时我们就无法得知应用层面修改了哪些字段了。




 

 1///& lt; summary>
  2///一个具体的实体
  3///& lt;/summary>
  4公共类AccountEntity: MainEntity
  5 {
  6///& lt; summary>
  7///文本类型
  8///& lt;/summary>
  9公共虚拟字符串账户{得到;设置;}
  10///& lt; summary>
  11///又一个文本属性
  12个///& lt;/summary>
  13个公共虚拟字符串密码{得到;设置;}
  14///& lt; summary>
  15///数字类型
  16///& lt;/summary>
  17个公共虚拟int性{得到;设置;}
  18///& lt; summary>
  19///事件类型
  20///& lt;/summary>
  21日公共虚拟DateTime生日{得到;设置;}
  22///& lt; summary>
  23///双精度浮点数
  24///& lt;/summary>
  25公共虚拟双高度{得到;设置;}///26日& lt; summary>///27日十进制数
  28///& lt;/summary>
  29日公共虚拟十进制因{得到;设置;}
  30///& lt; summary>
  31日///二进制
  32///& lt;/summary>
  33公共虚拟byte [] PublicKey{得到;设置;}
  34///& lt; summary>
  35///Guid类型
  36个///& lt;/summary>
  37公共虚拟Guid AreaId{得到;设置;}
  38}

=new accountEntity var实体();
  entity.Id=1;
  实体。账户=案粜愿持? # 39;;

db.Update(实体);

db.Update(实体,“Account");


保护Dictionary<字符串,dynamic>FieldTracking=new Dictionary<字符串,dynamic> (); 

FieldTracking [“Account"]=案粜愿持怠?



公共账户   {   得到   {返回_Account;}   集{   _Account=价值;   FieldTracking [“Account"]=价值;   }   }






//获取实体所在的程序集(ClassLibraryDemo)   var assemblyArray=AppDomain.CurrentDomain.GetAssemblies ()   其中(w=比;w.GetName ()。名字==癈lassLibraryDemo")   .ToList ();//实体的基类   var baseEntityType=typeof (BaseEntity);//循环程序集   foreach (assemblyArray组装项目)   {//找到这个程序集中继承自基类的实体   var=item.GetTypes类型()。在哪里(t=比;t。IsAbstract==假   ,,baseEntityType.IsAssignableFrom (t)   ,,t !=baseEntityType);   foreach(类型btItem类型){//遍历这个实体类中的属性=btItem.GetProperties (BindingFlags var属性。公共| BindingFlags.Instance)   其中(w=比;w。CanRead,,w.CanWrite   ,,w.GetCustomAttributes (typeof (NoMapAttribute),假).Any ()==false//TODO:要不要检查得到方法?   ,,w.GetSetMethod () .IsVirtual);   }   }

//首先创建一个与实体类对应的动态类   CodeTypeDeclaration ct=new CodeTypeDeclaration (btItem。名称+“_Dynamic");//循环实体中的所有标记为虚拟的属性   foreach (PropertyInfo fiItem属性)   {//创建一个属性   var p=新CodeMemberProperty ();//设置属性为公共,重写   p。=MemberAttributes属性。公共| MemberAttributes.Override;//覆盖//设置属性的类型为继承的属性的数据类型   p。类型=new CodeTypeReference (fiItem.PropertyType);//属性名称与继承的一致   p。=fiItem.Name名称;//包含组代码   p。HasSet=true;//包含得到代码   p。HasGet=true;//设置有代码//返回base.Account   p.GetStatements。添加(新CodeMethodReturnStatement (   新CodeFieldReferenceExpression (   新的CodeBaseReferenceExpression (), fiItem.Name)));//设置组代码//base.Account=价值;   p.SetStatements.Add (   新CodeAssignStatement (   新CodeFieldReferenceExpression (   新的CodeBaseReferenceExpression (), fiItem.Name),   新CodePropertySetValueReferenceExpression ()));//FieldTracking [“Account"]=价值;   p.SetStatements。添加(新CodeSnippetExpression (“FieldTracking [\”;“+ fiItem。名称+“\“]=value"));//将属性添加到类中   ct.Members.Add (p);   }

c#中实现监控类属性更改的代码案例分享