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