在java的技术栈当中,著名的Cglib库里面有一个BeanCopier,这个类的功能就是可以完成两个对象的属性复制工作(哪怕属于两个不同的类).

今天本人通过.net内置的System.Reflection.Emit命名空间写了一个.net版本的BeanCopier,实现原理是基于Emit来直接操作中间代码,从而动态生成实现,类似于一个动态代理。

Nuget安装依赖:

Install-Package BeanCopier -Version 2.1.0

代码如下:

using BeanCopier.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BeanCopier.Emit; namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
// 通过工程方法得到一个BeanCopier
var beanCopier = EmitBeanCopierFactory.Instance.Create<User, UserInfo>();
// 源属性对象
var user = new User()
{
Name = "Tom",
Id = ,
Age = ,
Password = "****"
};
// 目标属性对象
var userInfo = new UserInfo();
// 调用动态生成的copy方法
beanCopier.Copy(user, userInfo);
// 使用一个自定义的转换器,将自动被回调
var selfConverter = new SelfConverter();
// 使用自定义转换
beanCopier.Copy(user,userInfo, selfConverter); Console.ReadLine();
}
} public class SelfConverter : BeanConverter<User, UserInfo>
{
public UserInfo Convert(User souce, UserInfo target)
{
Console.WriteLine("Hello World");
return target;
}
} public class User
{
public Int32 Id { get; set; } public String Name { get; set; } public Byte Age { get; set; } public String Password { get; set; }
} public class UserInfo
{
public Int32 Id { get; set; } public String Name { get; set; } public Byte Age { get; set; } public String Password { get; set; }
} }

该工具的限制条件是:
1.源类和目标类均必须为public类型

2.源类的属性需要具备public类型的get访问器

3.目标类的属性需要具备public类型的set访问器

4.自定义的转换器需要为public类型

源码地址:https://github.com/FanHuaRan/dotnetbeancopier

欢迎大家一起来完善这个工具,有问题可以发邮件与我联系:834171100@qq.com

最新文章

  1. 02 button的练习
  2. JavaScript学习笔记——DOM_对document对象的内容、属性、样式的操作
  3. HDU5834 Magic boy Bi Luo with his excited tree(树形DP)
  4. javascript单元测试工具
  5. Appium-android环境的快速搭建
  6. Codeforces 626G Raffles 【贪心】【线段树】
  7. C++简介
  8. Spring 入门 Ioc-Xml
  9. android JB2连拍降速原理介绍
  10. chapter 13_4 跟踪table的访问
  11. 解决eclipse svn 转 maven web 项目中遇到找不到maven managed dependencies的问题
  12. SQLite相关异常
  13. 黄聪:PHP JSON_ENCODE 不转义中文汉字的方法
  14. MATLAB拟合正态分布
  15. 蒙特卡罗(Monte Carlo)方法简介
  16. 关于on commit preserve rows与on commit delete rows的测试
  17. oracle数据update后怎么恢复到以前的数据
  18. Java-jdbc连接简化类jdbcUtil
  19. [Xamarin.Android]如何引用JAR檔案 (转帖)
  20. Windows下Oracle数据库自动备份批处理脚本

热门文章

  1. LeetCode之“散列表”:Contains Duplicate &amp;&amp; Contains Duplicate II
  2. Erlang cowboy 架构
  3. 拆轮子之Fish动画分析
  4. Spring的声明式事务管理
  5. linux设备驱动--等待队列实现
  6. 【图片版】学习CSS网格布局
  7. storm中的Scheduler
  8. .net开发微信(1)——微信订阅号的配置
  9. 多重影分身——C#中多线程的使用三(调用方法和传参)
  10. 使用mpvue开发微信小程序