• 基于Emit实现的C#版本的BeanCopier


    在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

  • 相关阅读:
    Celery
    Xadmin的基本使用 补充:admin控制user字段
    Python pip换源 创建虚拟环境 luffy项目配置(数据库bug)
    gitignore 文件 刷新
    django python mange.py runserver 源码
    leetcode125. 验证回文串 python 简单
    leetcode1028 从先序遍历还原二叉树 python 100%内存 一次遍历
    fiddler
    xpath
    linux常用命令
  • 原文地址:https://www.cnblogs.com/Huaran1chendu/p/9057925.html
Copyright © 2020-2023  润新知