标签:version 依赖 生成 通过 一起 reflect 不同 linq []
在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 = 1, Age = 12, 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
标签:version 依赖 生成 通过 一起 reflect 不同 linq []
原文地址:https://www.cnblogs.com/Huaran1chendu/p/9057925.html