zoukankan      html  css  js  c++  java
  • 基于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

  • 相关阅读:
    Google Plus 是什么?Google+让Google在线资产在日常生活中更普及
    再谈JavaScript的数据类型问题
    [置顶]信息发布系统 Jquery+MVC架构开发(5)DAL层
    Android:一个简单查询界面的实现
    定制圆角带背景色的矩形边框
    提高c#位图操作的速度[抄袭之作]
    使用XmlTextWriter和XmlTextReader操作Xml文件
    使用Mutex实现单程序实例
    单例模式实现延迟加载
    A记录、MX记录、CNAME 记录、URL转发、NS记录解释
  • 原文地址:https://www.cnblogs.com/Huaran1chendu/p/9057925.html
Copyright © 2011-2022 走看看