zoukankan      html  css  js  c++  java
  • DataTable 转 Entity

    代码
    /// <summary>
    /// DataTransfer 的摘要说明
    /// </summary>
    public static class DataTransfer
    {
        
    /// <summary>
        
    /// datatable to list
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        
    /// <param name="dt"></param>
        
    /// <returns></returns>
        public static List<T> ToList<T>(DataTable dt)
        {
            List
    <T> list = new List<T>();
            
    if (dt == nullreturn list;
            
    if (dt.Rows.Count < 1return 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;
        }

        
    /// <summary>
        
    /// builder
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        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;
            }
        }
  • 相关阅读:
    嵌入式交叉编译环境的搭建
    linux驱动模块编写规范以及Makefiel文件的编写规范
    socket通信
    傀儡进程脱壳三步曲
    Thymeleaf 学习笔记-实例demo(中文教程)
    IntelliJ IDEA 快捷键
    github团队协作教程
    thymeleaf 学习笔记-基础篇(中文教程)
    二维码的生成
    .Net Core Web Api实践(四)填坑连接Redis时Timeout performing EVAL
  • 原文地址:https://www.cnblogs.com/OSoft/p/1895485.html
Copyright © 2011-2022 走看看