/// <summary>

/// DataTable转List<Model>通用类【实体转换辅助类】

/// </summary>

public class ModelConvertHelper<T> where T : new()

{

public static IList<T> ConvertToModel(DataTable dt)

{

// 定义集合

IList<T> ts = new List<T>();

// 获得此模型的类型

Type type = typeof(T);

string tempName = "";

foreach (DataRow dr in dt.Rows)

{

T t = new T();

// 获得此模型的公共属性

PropertyInfo[] propertys = t.GetType().GetProperties();

foreach (PropertyInfo pi in propertys)

{

tempName = pi.Name; // 检查DataTable是否包含此列

if (dt.Columns.Contains(tempName))

{

// 判断此属性是否有Set

if (!pi.CanWrite) continue;

object value = dr[tempName];

if (value != DBNull.Value)

pi.SetValue(t, value, null);

}

}

ts.Add(t);

}

return ts;

}

}

//方法二:使用emit实现
public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class, new()

{

List<TResult> list = new List<TResult>();

if (dt == null) return list;

DataTableEntityBuilder<TResult> eblist = DataTableEntityBuilder<TResult>.CreateBuilder(dt.Rows[0]);

foreach(DataRow info in dt.Rows) list.Add(eblist.Build(info));

dt.Dispose(); dt = null;

return list;

}

public class DataTableEntityBuilder<Entity>

{

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 Entity Load(DataRow dataRecord);

private Load handler;

private DataTableEntityBuilder() { }

public Entity Build(DataRow dataRecord) {

return handler(dataRecord);

}

public static DataTableEntityBuilder<Entity> CreateBuilder(DataRow dataRecord) {

DataTableEntityBuilder<Entity> dynamicBuilder = new DataTableEntityBuilder<Entity>();

DynamicMethod method = new DynamicMethod("DynamicCreateEntity", typeof(Entity), new Type[] { typeof(DataRow) }, typeof(Entity), true);

ILGenerator generator = method.GetILGenerator();

LocalBuilder result = generator.DeclareLocal(typeof(Entity));

generator.Emit(OpCodes.Newobj, typeof(Entity).GetConstructor(Type.EmptyTypes));

generator.Emit(OpCodes.Stloc, result);

for (int i = 0; i < dataRecord.ItemArray.Length; i++) {

PropertyInfo propertyInfo = typeof(Entity).GetProperty(dataRecord.Table.Columns[i].ColumnName);

Label endIfLabel = generator.DefineLabel();

if (propertyInfo != null && propertyInfo.GetSetMethod() != null) {

generator.Emit(OpCodes.Ldarg_0);

generator.Emit(OpCodes.Ldc_I4, i);

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, i);

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;

}

}

DataTable转List<Model>通用类【实体转换辅助类】的更多相关文章

  1. DataTable转List<Model>通用类

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  2. Datatable转实体 实体转换辅助类

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  3. .NET 实体转换辅助类

    /// <summary> /// 实体转换辅助类 /// </summary> public class ModelConvertHelper<T> where ...

  4. DataTable转换为List<Model>的通用类

    在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便. 所以很多人都是按照以下方式做的: // 获得查询结果DataTable dt = DbHelper ...

  5. DataTable与实体类互相转换

    /// <summary> /// DataTable与实体类互相转换 /// </summary> /// <typeparam name="T"& ...

  6. DataTable与实体类的转换

    多年前写的DataTable与实体类的转换,已放github 阅读目录 介绍 起因 代码 UnitTest GitHub 介绍 很多年前一直使用Ado.net,后来慢慢转型到其他的orm,在转型过程中 ...

  7. 【转】DataTable与实体类互相转换

    原文地址:https://www.cnblogs.com/marblemm/p/7084797.html /// <summary> /// DataTable与实体类互相转换 /// & ...

  8. DataTable数据赋值给Model通用方法

    注:该文属本人原创,今后项目中发现该方法存在BUG会实时更新,转载记得附上原文出处,方便大家获得最新代码. 相信大家在做项目中,经常会根据不同的表new各种不同的Model,当需要对Model进行实例 ...

  9. net core天马行空系列-可用于依赖注入的,数据库表和c#实体类互相转换的接口实现

    1.前言 hi,大家好,我是三合.作为一名程序猿,日常开发中,我们在接到需求以后,一般都会先构思一个模型,然后根据模型写实体类,写完实体类后在数据库里建表,接着进行增删改查, 也有第二种情况,就是有些 ...

随机推荐

  1. Netty 的Downstream 和 Upstream

    Netty的Downstream 和 Upstream 如果一个event从第一个handler传递直到最后一个handler就是 Upstream 相反的如果一个event从最后一个handler传 ...

  2. SaaS系列介绍之十五: SaaS知识重用

    1 建立并积累自己的开发体系 遵行业界的规定又有自己的特色是我们所追求的目标.成功的软件公司都有丰富而可复用的代码组件,几行代码在单个系统里可能无足轻重,但一旦可在大量的系统中可重复使用那就是价值不菲 ...

  3. 自旋锁spin_lock和raw_spin_lock

    自旋锁spin_lock和raw_spin_lock Linux内核spin_lock.spin_lock_irq 和 spin_lock_irqsave 分析 http://blog.csdn.ne ...

  4. web服务器、应用服务器、http服务器区别

    引用 WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器     Web服务器的基本功能就是提供Web信息 ...

  5. 在PowerDesigner中设计物理模型3——视图、存储过程和函数

    原文:在PowerDesigner中设计物理模型3--视图.存储过程和函数 视图 在SQL Server中视图定义了一个SQL查询,一个查询中可以查询一个表也可以查询多个表,在PD中定义视图与在SQL ...

  6. 无刷新分页 jquery.pagination.js

     无刷新分页 jquery.pagination.js 采用Jquery无刷新分页插件jquery.pagination.js实现无刷新分页效果 1.插件参数列表 http://www.dtan.so ...

  7. 246. Strobogrammatic Number

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  8. C++:对象的初始化和构造函数

    对象的初始化和构造函数 构造函数:是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化.构造函数 的名字必须与类名相同,它不要用户来调用,而是在建立对象时自动执行的 形式一: 类名 对象名(实参 ...

  9. Android 自定义ActionBar

    Android 3.0及以上已经有了ActionBar的API,可以通过引入support package在3.0以下的平台引用这些API,但这儿呢,完全自定义一个ActionBar,不用引入额外ja ...

  10. Eliza Doolittle lyrics Big City

    Eliza Doolittle lyrics  Big City 歌词很好,现在还没有,以后添加进来.