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;
            }
        }
  • 相关阅读:
    [转]Java中的POJO类
    使用PD进行数据库建模时的问题
    N-Gram模型
    [转] C#开源项目大全
    HTTP Error 503. The service is unavailable.
    abp 取消权限校验
    Oracle expdp/impdp导出导入命令及数据库备份(转)
    Oracle ORA-14102: 只能指定一个 LOGGING 或 NOLOGGING 子句
    Oracle ORA-01940: 无法删除当前连接的用户
    Oracle 把查询的多个字段赋值给多个变量
  • 原文地址:https://www.cnblogs.com/OSoft/p/1895485.html
Copyright © 2011-2022 走看看