在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. Gradle 1.12用户指南翻译——第二十七章. Ear 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  2. 阳阳买苹果--C实现

    原题:阳阳第一天买了两个苹果,一个苹果0.8元.从第二天开始,他每天购买前一天苹果数量的2倍,直到购买的苹果个数达到不超过100的最大值.编程求阳阳平均每天花多少钱? 编程思路: 假设阳阳每天购买苹果 ...

  3. linux设备驱动--等待队列实现

    #include <linux/module.h> #include <linux/fs.h> #include <linux/sched.h> #include ...

  4. 关于linux内核驱动开发中Makefile编译的问题

    obj-y:打个比方,我要编译的是hello.c这个文件,obj-y就会把hello.c或者hello.c编译生成的hello.s文件链接到内核中去. obj-m:打个比方,我要编译的是hello.c ...

  5. LeetCode(52)-Remove Linked List Elements

    题目: Remove all elements from a linked list of integers that have value val. Example Given: 1 --> ...

  6. The 3rd tip of DB QueryAnalyzer

     The 3rd tip of DB Query Analyzer Ma Genfeng (Guangdong Unitoll Services incorporated, Guangzhou 510 ...

  7. jquery左右折叠框

    网站左右折叠框: <!DOCTYPE html> <html> <style> #Kefclose,#Kefopen{position:absolute;left: ...

  8. 前端技术之_CSS详解第四天

    前端技术之_CSS详解第四天 一.第三天的小总结 盒模型box model,什么是盒子? 所有的标签都是盒子.无论是div.span.a都是盒子.图片.表单元素一律看做文本. 盒模型有哪些组成: wi ...

  9. decode ways(动态规划)

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  10. oracle 查看表的索引信息

    1.select * from user_indexes where table_name='PAMSODT0P02' 2.select * from user_ind_columns  where ...