DataTable 转 Entity

ExpandedBlockStart.gif 代码
///   <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  ==   null return  list;
        
if  (dt.Rows.Count  <   1 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;
    }

    
///   <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;
        }
    }

 

转载于:https://www.cnblogs.com/OSoft/archive/2010/12/03/1895485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值