华然 阅读(51) 评论(0)

在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