zoukankan      html  css  js  c++  java
  • C# 快速高效率复制对象另一种方式 表达式树

    1.传统方式进行对象赋值  2.反射或序列化动态赋值 3.通过表达式结合缓存赋值合适大量的数据复制

    具体实现代码

     /// <summary>
            /// 复制对象(反射)
            /// </summary>
            /// <typeparam name="TIn">复制需要的对象</typeparam>
            /// <typeparam name="TOut">输出对象</typeparam>
            /// <param name="tIn"></param>
            /// <returns></returns>
            private static TOut TransReflection<TIn, TOut>(TIn tIn)
            {
                TOut tOut = Activator.CreateInstance<TOut>();
                foreach (var itemOut in tOut.GetType().GetProperties())
                {
                    var itemIn = tIn.GetType().GetProperties().Where(i => i.Name == itemOut.Name).FirstOrDefault();
                    if (itemIn != null)
                    {
                        itemOut.SetValue(tOut, itemIn.GetValue(tIn));
                        Console.WriteLine(itemIn.GetValue(tIn));
                    }
                }
                return tOut;
            }
            /// <summary>
            /// 表达式树 复制对象通用代码
            /// </summary>
            /// <typeparam name="TIn">复制需要的对象</typeparam>
            /// <typeparam name="TOut">输出对象</typeparam>
            /// <param name="tIn"></param>
            /// <returns></returns>
            private static TOut TransExp<TIn, TOut>(TIn tIn)
            {
                string key = string.Format("trans_exp_{0}_{1}", typeof(TIn).FullName, typeof(TOut).FullName);
                if (!_Dic.ContainsKey(key))
                {
                    ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
                    List<MemberBinding> memberBindingList = new List<MemberBinding>();
    
                    foreach (var item in typeof(TOut).GetProperties())
                    {
                        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 });
                    Func<TIn, TOut> func = lambda.Compile();
    
                    _Dic[key] = func;
                }
                return ((Func<TIn, TOut>)_Dic[key])(tIn);
            }
    

      

    原文:http://www.cnblogs.com/emrys5/p/expression_trans_model.html

  • 相关阅读:
    Luogu P3703 [SDOI2017]树点涂色
    好吧,又建了一个博客
    JDI tutorial (trace example)
    【译文】Java Logging
    openjdk 完全编译指南
    入门: 使用JNI 从C++代码中调用Java的静态方法
    使用JVMTI创建调试和监控代理
    【译文】 GC 安全点 和安全区域
    Java虚拟机 safepoints 初探
    NoClassDefFoundError vs ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/MingqiSs/p/7723250.html
Copyright © 2011-2022 走看看