zoukankan      html  css  js  c++  java
  • C#对象深表复制方法

     //反射
            public static TOut TransReflection<TIn, TOut>(TIn tIn)
            {
                TOut tOut = Activator.CreateInstance<TOut>();
                var tInType = tIn.GetType();
                foreach (var itemOut in tOut.GetType().GetProperties())
                {
                    var itemIn = tInType.GetProperty(itemOut.Name); ;
                    if (itemIn != null)
                    {
                        itemOut.SetValue(tOut, itemIn.GetValue(tIn,null),null);
                    }
                }
                return tOut;
            }
    
            //序列化
            public static TOut TransJsonConvert<TIn, TOut>(TIn tIn)
            {           
                return JsonConvert.DeserializeObject<TOut>(JsonConvert.SerializeObject(tIn));
            }
    using System.Linq.Expressions;
     /// <summary>
        /// 表达式树实现的深表复制
        /// </summary>
        /// <typeparam name="TIn"></typeparam>
        /// <typeparam name="TOut"></typeparam>
        public static class TransExp<TIn, TOut>
        {
    
            private static readonly Func<TIn, TOut> cache = GetFunc();
            private static Func<TIn, TOut> GetFunc()
            {
                ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
                List<MemberBinding> memberBindingList = new List<MemberBinding>();
    
                foreach (var item in typeof(TOut).GetProperties())
                {
                    if (!item.CanWrite)
                        continue;
    
                    MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
                    MemberBinding memberBinding = Expression.Bind(item, property);
                    memberBindingList.Add(memberBinding);
                }
    
                MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
                Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[] { parameterExpression });
    
                return lambda.Compile();
            }
    
            public static TOut Trans(TIn tIn)
            {
                return cache(tIn);
            }
        }
  • 相关阅读:
    k8s与监控--k8s部署grafana6.0
    执行kubectl create-f replicaset.yaml后k8s是如何工作的
    Kubernetes+Prometheus+Grafana部署笔记
    Kubernetes Storage Persistent Volumes
    Linux出现假死,怎么回事?
    《算法导论》
    各种算法的核心思想
    Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
    Java编程思想中关于闭包的一个例子
    Java编程思想第四版随书源码官方下载方法
  • 原文地址:https://www.cnblogs.com/taofengfeng/p/11095467.html
Copyright © 2011-2022 走看看