• 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;
            }
        }
  • 相关阅读:
    Windows 中 SQLite3 使用(1) -- 配置
    vs中qt的QIcon图标图片加载不上的问题
    VS中QT资源文件qrc加载失败(Q_INIT_RESOURCE)qInitResources_出错
    c++前置声明的一点总结
    Windows 如何在cmd命令行中查看、修改、删除与添加环境变量
    在DLL对话框中截获鼠标按下的消息
    c++跨动态库DLL的内存分配与释放问题
    C++中placement new操作符(经典)
    起底多线程同步锁(iOS)
    AutoLayout框架Masonry使用心得
  • 原文地址:https://www.cnblogs.com/OSoft/p/1895485.html
Copyright © 2020-2023  润新知