首页 > 其他分享 >ExpressionTreeHelper 表达式树泛型委托拷贝方法

ExpressionTreeHelper 表达式树泛型委托拷贝方法

时间:2024-11-21 10:17:43浏览次数:1  
标签:PeopleCopy people ExpressionTreeHelper item var new 拷贝 Expression 树泛

var people = new People()
{
    Id = 11,
    Name = "Richard",
    Age = 31
};
int count = 1_000_000;
var common = HiPerfTimer.Execute(() =>
{
    for (int i = 0; i < count; i++)
    {
        var item = new PeopleCopy()
        {
            Id = people.Id,
            Name = people.Name,
            Age = people.Age,
        };
    }
});
Console.WriteLine(string.Format("common={0} ms", common));

var serialize = HiPerfTimer.Execute(() =>
{
    PeopleCopy item = new PeopleCopy();
    for (int i = 0; i < count; i++)
    {
        var rslt = JsonConvert.SerializeObject(people);
        item = JsonConvert.DeserializeObject<PeopleCopy>(rslt);
    }
});
Console.WriteLine(string.Format("serialize={0} ms", serialize));

var generic = HiPerfTimer.Execute(() =>
{
    PeopleCopy item = new PeopleCopy();
    for (int i = 0; i < count; i++)
    {
        item = ExpressionTreeHelper<PeopleCopy>.EntityMap(people);
    }
});
Console.WriteLine(string.Format("generic={0} ms", generic));

var copy = HiPerfTimer.Execute(() =>
{
    PeopleCopy item = new PeopleCopy();
    for (int i = 0; i < count; i++)
    {
        var aa = people.DeepCopy();
    }
});
Console.WriteLine(string.Format("DeepCopy={0} ms", copy));
 public class ExpressionTreeHelper<T>
 {
     public static T EntityMap<TSrc>(TSrc src)
     {
         return ExpressionGenericMapper<TSrc, T>.EntityMap(src);
     }
 }

 internal class ExpressionGenericMapper<TSrc, TDst>
 {
     private static readonly Func<TSrc, TDst> _func = null;

     static ExpressionGenericMapper()
     {
         var parameterExpression = Expression.Parameter(typeof(TSrc), "e");
         var list = new List<MemberBinding>();
         foreach (var item in typeof(TDst).GetProperties())
         {
             var property = Expression.Property(parameterExpression, typeof(TSrc).GetProperty(item.Name));
             var binding = Expression.Bind(item, property);
             list.Add(binding);
         }
         foreach (var item in typeof(TDst).GetFields())
         {
             var property = Expression.Field(parameterExpression, typeof(TSrc).GetField(item.Name));
             var binding = Expression.Bind(item, property);
             list.Add(binding);
         }

         var miExpression = Expression.MemberInit(Expression.New(typeof(TDst)), list.ToArray());
         var lambda = Expression.Lambda<Func<TSrc, TDst>>(miExpression, new[]
         {
             parameterExpression
         });
         _func = lambda.Compile();
     }

     public static TDst EntityMap(TSrc obj)
     {
         return _func(obj);
     }
 }

标签:PeopleCopy,people,ExpressionTreeHelper,item,var,new,拷贝,Expression,树泛
From: https://www.cnblogs.com/wesson2019-blog/p/18560057

相关文章

  • Python 语法基础:赋值、深浅拷贝、可变与不可变对象
    Python是一种广泛使用的高级编程语言,其语法简洁且功能强大。本文将详细讲解Python中的赋值、深浅拷贝以及可变与不可变对象的基本概念和使用方法。一、赋值赋值是编程中最基本的操作之一,它用于将值或对象绑定到变量名。在Python中,赋值使用等号=来进行。a=10......
  • 25. 深浅拷贝
    一、深浅拷贝问题  在C++中,对象的拷贝可以分为浅拷贝(ShallowCopy)和深拷贝(DeepCopy)。  浅拷贝是指当一个对象拷贝另一个对象时,只是简单地复制了对象的各个成员变量的值,包括指向其他对象的指针。这意味着,如果源对象和目标对象中的成员变量是指针类型,那么浅拷贝只会......
  • kafka的零拷贝详解
    什么是kafka中的零拷贝问题1.传统的IO拷贝传统的一次I/O流程包括应用程序发起读(read)或写(write)请求,操作系统将请求传递给设备驱动程序,驱动程序与硬件设备通信执行操作,设备完成后返回结果,操作系统再将结果返回给应用程序,应用程序根据结果进行处理。整个过程通常是同步的,应用程......
  • C++ 移动构造和拷贝构造函数匹配
    既有拷贝构造又有移动构造这个比较好理解,普通的函数匹配规则就可以。右值移动,左值拷贝。——《C++Primer》P477我们不能隐式地将一个右值引用绑定到一个左值。有拷贝构造但没有移动构造这种情况,右值也会被拷贝。如果一个类没有移动构造函数,函数匹配规则保证该类型的对象......
  • 为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么
    有时需要复制一个对象,并且希望保留原有的对象进行接下来的操作。这时就需要使用克隆。如何实现对象克隆?实现Cloneable接口并重写clone方法:实现​​Cloneable​​接口后,可以调用​​Object.clone()​​方法来创建一个新的对象。通过序列化和反序列化实现深克隆:将对象转......
  • python中copy模块的使用,深拷贝和浅拷贝
    文章目录一、copy模块的介绍1、copy模块二、copy模块的使用拓展说明:1、id()函数的使用2、is和==的区别python的轮子太多啦,下面介绍一下这个小模块的使用一、copy模块的介绍1、copy模块copy模块用于对象的拷贝操作。copy模块非常简单,只有两个api。分别是copy.......
  • 深拷贝函数的实现
    functiondeepClone(obj,hash=newWeakMap()){//处理null、undefined、非对象的情况(直接返回值)if(obj===null||typeofobj!=='object')returnobj;//防止循环引用if(hash.has(obj))returnhash.get(obj);//支持Date、RegExp类型......
  • java浅拷贝BeanUtils.copyProperties引发的RPC异常
    作者:京东物流吴义背景近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到人在地铁上,bug从咚咚来~没有任何修改的服务接口,抛出异常:java.lang.ClassCastException:java.util.HashMapcannotbecastto......
  • 构造函数的调用规则、深拷贝与浅拷贝
    目录1.调用规则2.深拷贝和浅拷贝问题3.string类的拷贝构造练习1.调用规则默认情况下,C++至少会给一个类添加三个函数:    1.默认构造函数(无参,函数体为空)    2.默认析构函数(无参,函数体为空)        3.默认拷贝构造函数,对属性进行值拷贝调用规......
  • c++--拷贝构造函数&友元函数
    目录1.拷贝构造函数是什么2.拷贝构造函数的基本格式2.1默认拷贝构造函数(浅拷贝)2.2深拷贝(DeepCopy)2.3浅拷贝(ShallowCopy)2.3浅拷贝和深拷贝总结2.友元函数1.拷贝构造函数是什么拷贝构造函数是一个特殊的构造函数,用于在创建新对象时,用已有对象的数据来初始......