zoukankan      html  css  js  c++  java
  • DataTableToList 优化后 武胜

    View Code http://www.codeproject.com/Articles/19513/Dynamic-But-Fast-The-Tale-of-Three-Monkeys-A-Wolf
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Reflection;
    using System.Reflection.Emit;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SharpShell
    {
        //DataTable转Entity(Emit版)
        //30000条数据,直接发射的话7秒多,Emit1.2秒左右
        public static class NewClas
        {
    
            public static List<T> ToList<T>(DataTable dt)
            {
                List<T> list = new List<T>();
                if (dt == null) return list;
                DataTableEntityBuilder<T> eblist = DataTableEntityBuilder<T>.CreateBuilder(dt.Rows[0]);
                foreach (DataRow info in dt.Rows)
                    list.Add(eblist.Build(info));
                dt.Dispose();
                dt = null;
                return list;
            }
    
            public class DataTableEntityBuilder<T>
            {
                private static readonly MethodInfo getValueMethod = typeof (DataRow).GetMethod("get_Item",
                                                                                               new Type[] {typeof (int)});
    
                private static readonly MethodInfo isDBNullMethod = typeof (DataRow).GetMethod("IsNull",
                                                                                               new Type[] {typeof (int)});
    
                private delegate T Load(DataRow dataRecord);
    
                private Load handler;
    
                private DataTableEntityBuilder()
                {
                }
    
                public T Build(DataRow dataRecord)
                {
                    return handler(dataRecord);
                }
    
    
                public static DataTableEntityBuilder<T> CreateBuilder(DataRow dataRow)
                {
                    DataTableEntityBuilder<T> dynamicBuilder = new DataTableEntityBuilder<T>();
                    DynamicMethod method = new DynamicMethod("DynamicCreateEntity", typeof (T),
                                                             new Type[] {typeof (DataRow)}, typeof (T), true);
                    ILGenerator generator = method.GetILGenerator();
                    LocalBuilder result = generator.DeclareLocal(typeof (T));
                    generator.Emit(OpCodes.Newobj, typeof (T).GetConstructor(Type.EmptyTypes));
                    generator.Emit(OpCodes.Stloc, result);
    
                    for (int index = 0; index < dataRow.ItemArray.Length; index++)
                    {
                        PropertyInfo propertyInfo = typeof (T).GetProperty(dataRow.Table.Columns[index].ColumnName);
                        Label endIfLabel = generator.DefineLabel();
                        if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
                        {
                            generator.Emit(OpCodes.Ldarg_0);
                            generator.Emit(OpCodes.Ldc_I4, index);
                            generator.Emit(OpCodes.Callvirt, isDBNullMethod);
                            generator.Emit(OpCodes.Brtrue, endIfLabel);
                            generator.Emit(OpCodes.Ldloc, result);
                            generator.Emit(OpCodes.Ldarg_0);
                            generator.Emit(OpCodes.Ldc_I4, index);
                            generator.Emit(OpCodes.Callvirt, getValueMethod);
                            generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType);
                            generator.Emit(OpCodes.Callvirt, propertyInfo.GetSetMethod());
                            generator.MarkLabel(endIfLabel);
                        }
                    }
                    generator.Emit(OpCodes.Ldloc, result);
                    generator.Emit(OpCodes.Ret);
                    dynamicBuilder.handler = (Load) method.CreateDelegate(typeof (Load));
                    return dynamicBuilder;
                }
            }
        }
    }
  • 相关阅读:
    桥接模式(从多个角度对实现进行分类)
    单例模式
    组合模式(解决 树形 ,局部与整体关系)
    备忘录模式
    适配器模式
    状态模式
    StartUML建模及生成java实体代码
    JPA删除接口报错 : org.hibernate.LazyInitializationException: failed to lazily initialize a collection, could not initialize proxy
    idea创建的gradle项目没有src目录怎么办?
    idea spring源码 gradle编译失败问题
  • 原文地址:https://www.cnblogs.com/zeroone/p/3041918.html
Copyright © 2011-2022 走看看