基于反射解决类复制的实现方法

 更新时间:2020年6月25日 11:41  点击:1736

假定一个类,类名是EtyBase,另一个类类名是EtyTwo,EtyTwo继承自EtyBase。现在要求EtyTwo的属性值从一个EtyBase中复制过来传统做法是

复制代码 代码如下:

View Code

  public void CopyEty(EtyBase from, EtyBase to)
  {
to.AccStatus = from.AccStatus;
to.Alarm = from.Alarm;
to.AlarmType = from.AlarmType;
to.CarNum = from.CarNum;
to.DevNum = from.DevNum;
to.DeviceNum = from.DeviceNum;
to.Direct = from.Direct;
to.DriveCode = from.DriveCode;
to.GpsData = from.GpsData;
to.GpsEnvent = from.GpsEnvent;
to.GpsOdo = from.GpsOdo;
to.GpsSpeed = from.GpsSpeed;
to.GpsStatus = from.GpsStatus;
to.GpsrevTime = from.GpsrevTime;
to.Gsmci = from.Gsmci;
to.Gsmci1 = from.Gsmci1;
to.Gsmloc = from.Gsmloc;
to.Gsmloc1 = from.Gsmloc1;
to.IsEffective = from.IsEffective;
to.IsJump = from.IsJump;
to.IsReply = from.IsReply;
to.Latitude = from.Latitude;
to.LaunchStatus = from.LaunchStatus;
to.Longitude = from.Longitude;
to.MsgContent = from.MsgContent;
to.MsgExId = from.MsgExId;
to.MsgId = from.MsgId;
to.MsgLength = from.MsgLength;
to.MsgType = from.MsgType;
to.NowOverArea = from.NowOverArea;
to.NowStatus = from.NowStatus;
to.Oil = from.Oil;
to.PulseCount = from.PulseCount;
to.PulseOdo = from.PulseOdo;
to.PulseSpeed = from.PulseSpeed;
to.ReplyContent = from.ReplyContent;
to.RevMsg = from.RevMsg;
to.Speed = from.Speed;
to.Status = from.Status;
to.Temperture = from.Temperture;
to.UserName = from.UserName;
  }


这样子做有几点不好的地方

    EtyBase的属性改变时复制的属性也得改变,耦合较高;
    若EtyBase的属性比较多,那么这个复制方法将显得比较冗长,写的人手累。

 

如果用反射来做,我是这么做的

复制代码 代码如下:

View Code

  public void CopyEty(EtyBase from, EtyBase to)
  {
//利用反射获得类成员
FieldInfo[] fieldFroms = from.GetType().GetFields();
FieldInfo[] fieldTos = to.GetType().GetFields();
int lenTo = fieldTos.Length;

for (int i = 0, l = fieldFroms.Length; i < l; i++)
{
    for (int j = 0; j < lenTo; j++)
    {
  if (fieldTos[j].Name != fieldFroms[i].Name) continue;
  fieldTos[j].SetValue(to, fieldFroms[i].GetValue(from));
  break;
    }
}
  }


反射可以解决上述的两个缺点,当类属性改变或增加时,此复制方法无需改变。当然这是要付出些许运行效率的。

[!--infotagslink--]

相关文章

  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • C# 复制与删除文件的实现方法

    这篇文章主要介绍了C# 复制与删除文件的实现方法的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下...2020-06-25
  • JavaScript深度复制(deep clone)的实现方法

    本文给大家介绍JavaScript深度复制(deep clone)的实现方法,涉及到js深度复制相关知识,本文介绍的非常详细,特此分享脚本之家平台供大家参考...2016-02-21
  • percona-toolkit对MySQL的复制和监控类操作教程

    复制类工具 1. pt-heartbeat 功能介绍: 监控mysql复制延迟 用法介绍: pt-heartbeat [OPTION...] [DSN] --update|--monitor|--check|--stop 测量复制落后主mysql或者主PostgreSQL多少时间,你可以使用这个脚本去更新主或...2015-11-24
  • C#中数组初始化与数组元素复制的方法

    这篇文章主要介绍了C#中数组初始化与数组元素复制的方法,涉及C#中数组的创建、初始化及使用Array.Copy方法复制数组元素的技巧,需要的朋友可以参考下...2020-06-25
  • mysql(master/slave)主从复制原理及配置图文详解

    这篇文章主要介绍了mysql(masterslave)主从复制原理及配置图文详解,以前脚本之家小编发过相关的内容,但这么好的非常少见特分享一下,需要的朋友可以参考下...2016-06-12
  • step by step配置mysql复制的具体方法

    采用全库复制的方案,方便管理mysql 5.5 + rhel5.810.4.11.12 master10.4.11.13 slave---Master端设置1, 创建复制帐号,需要复制和slave权限mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'10....2013-10-04
  • shell脚本批量复制及执行命令的示例详解

    这篇文章主要介绍了批量复制及执行命令shell脚本,本文通过列举几个示例给大家详细介绍,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • js实现复制粘贴的两种方法

    这篇文章主要为大家详细介绍了js实现的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-12-04
  • 代码块高亮可复制显示js插件highlight.js+clipboard.js整合

    最近有个需求是将jsp页面上的某一段代码块格式化成类似CSDN的代码块的样式,而且很多平台都使用了这样的功能,下面就为大家简单分享一下...2021-02-17
  • js实现点击复制当前文本到剪贴板功能(兼容所有浏览器)

    这篇文章主要介绍了js实现点击复制当前文本到剪贴板功能,兼容所有浏览器,感兴趣的小伙伴们可以参考一下...2015-12-24
  • 浅谈C#各种数组直接的数据复制/转换

    下面小编就为大家带来一篇浅谈C#各种数组直接的数据复制/转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C语言文件复制实例详解

    这篇文章主要介绍了C语言文件复制实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • Python使用openpyxl复制整张sheet

    这篇文章主要介绍了Python使用openpyxl复制整张sheet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-19
  • 深入理解JavaScript中的对象复制(Object Clone)

    下面小编就为大家带来一篇深入理解JavaScript中的对象复制(Object Clone)。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20
  • C++中对象的赋值与复制操作详细解析

    对象之间的赋值也是通过赋值运算符“=”进行的。本来赋值运算符“=”只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的...2020-04-25
  • Vue.js之slot深度复制详解

    这篇文章主要介绍了Vue.js之slot深度复制的相关资料,文中介绍的很详细,对大家具有一定的参考价值,需要的朋友们来一起看看吧。...2017-03-13
  • C#实现复制数据库 C#将A数据库数据转到B数据库

    这篇文章主要为大家详细介绍了C#复制数据库,将数据库数据转到另一个数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • MySQL的主从复制步骤详解及常见错误解决方法

    这篇文章主要介绍了MySQL的主从复制步骤详解及常见错误解决方法,文中主张同步时跳过临时错误,并对Slave_IO_Running: No错误的解决给出了方案,需要的朋友可以参考下...2016-03-02
  • SQL Server中的数据复制到的Access中的函数

    SQL Server中的数据复制到的Access中,表的结构相同 不要提用openrowset,因为Access文件和SQL Server不在一台机器上...2020-04-25