![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.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;
}
}
/// 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;
}
}