在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

基于Emit实现的C#版本的BeanCopier的更多相关文章

  1. 自用的基于Emit的C#下DataTable转实体类方法

    之前一直在做WebForm的开发,数据绑定时直接DataTable绑定Gridview很方便,但是最近开始往MVC转,数据列表的传递和页面展示基本上是以List为主,像下面这样,遍历实体类的各个字段去 ...

  2. Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课

    Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...

  3. SpringBoot之整合Redis分析和实现-基于Spring Boot2.0.2版本

    背景介绍 公司最近的新项目在进行技术框架升级,基于的Spring Boot的版本是2.0.2,整合Redis数据库.网上基于2.X版本的整个Redis少之又少,中间踩了不少坑,特此把整合过程记录,以供 ...

  4. 基于unity3d游戏的android版本逆向初探

    https://bbs.pediy.com/thread-212532.htm [文章标题]: 基于unity3d游戏的android版本逆向初探 [文章作者]: dreaman [作者邮箱]: [e ...

  5. PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)

    PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版) 先看流程图: 大概介绍一下: 版本选择使用jenkins 中的 git parameter 插件实现 回滚方式 ...

  6. 【K8S】K8S 1.18.2安装dashboard(基于kubernetes-dashboard 2.0.0版本)

    [K8S]K8S 1.18.2安装dashboard(基于kubernetes-dashboard 2.0.0版本) 写在前面 K8S集群部署成功了,如何对集群进行可视化管理呢?别着急,接下来,我们一 ...

  7. 菜渣开源一个基于 EMIT 的 AOP 库(.NET Core)

    目录 1,快速入门 1.1 继承 ActionAttribute 特性 1.2 标记代理类型 2,如何创建代理类型 2.1 通过API直接创建 2,创建代理类型 通过API 通过 Microsoft. ...

  8. 基于官方Drone-CI 的alpine版本asia亚洲时区构建支持. Drone-CI based alpine Timezone Build

    基于官方Drone-CI 的alpine版本最简化添加亚洲时区Dockerfile构建支持. iotd@Github: drone-ci-based-alpine-timezone-build 如添加 ...

  9. netty03(基于4.1.23.Final 版本的案例)

    基于前面的netty01和netty02修改一下版本,可以点进去的 将maven依赖版本改了一下 <!-- netty版本:netty-5.0.0.Alpha2 http://files.cnb ...

随机推荐

  1. LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  2. 如何上传代码到git上

    windows环境下上传代码到git仓库 1,https://github.com/new 2,创建成功后是这样子的 3,远程添加github上的Blog仓库. 1)进入本地文件夹下-右击鼠标-Git ...

  3. 恶补web之五:dhtml学习

    dhtml是一种使html页面具有动态特性的艺术.对于多数人来说dhtml意味着html(html DOM),样式表和javascript的组合. dhtml不是w3c标准.dhtml指动态html, ...

  4. 近期Mac上编译geany软件的总结

    以前在Mac上装过port,后来改为brew.但是原来port装在/opt/local下的很多程序没删掉,path路径也没改,导致很多程序被重复安装,配置混乱.最后我痛下狠心用port uninsta ...

  5. Runtime - ③ - 分类Category探究

    写博客只是为了让自己学的更深刻,参考:https://tech.meituan.com/DiveIntoCategory.html 分类(Category)是个啥玩意儿这里就不多介绍了,这里主要是研究 ...

  6. Python的基本数据数字、字符串、布尔值及其魔法

    基本数据类型介绍 若要把Pyhton的基本数据类型:数字(int).字符串(str).布尔(bool).列表(list).元组(tuple).字典(dict)都分为一个个不同的角色 如:战士,魔法师, ...

  7. Python并发编程-RabbitMQ消息队列

    RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  8. CSS的应用下

    样式继承: 就是父类的颜色如果变了,子类下的div(或者其他属性)会继承父类的. 参考代码: <!DOCTYPE html> <html lang="en"> ...

  9. GlitchBot -HZNU寒假集训

    One of our delivery robots is malfunctioning! The job of the robot is simple; it should follow a lis ...

  10. Java并发-容器

    同步容器类:同步容器类包括Vector和Hashtable.这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法进行同步,使得每次只有一个线程可以访问容器的状态.JDK1.2之后,提供了 ...