/// <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. 找啊找啊找GF

    P1013 找啊找啊找GF 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 MM七夕模拟赛 描述 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手, ...

  2. lintcode:哈希函数

    题目: 哈希函数 在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假 ...

  3. eclipse安装反编译插件

    1. 进入http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download          下载 net.sf.jadclipse ...

  4. Hibernate逍遥游记-第4章映射对象标识符-increment、identity、hilo、native、assigned、sequence、<meta>

    1. package mypack; import java.lang.reflect.Constructor; import org.hibernate.*; import org.hibernat ...

  5. NSArray 迭代

    NSObject *obj=[[NSObject alloc]init];        NSArray *array=[[NSArray alloc] initWithObjects:@" ...

  6. Java 进行 RSA 加解密时不得不考虑到的那些事儿

    1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无 ...

  7. C#使用sharppcap实现网络抓包

    sharppcap dll的下载地址: http://sourceforge.net/directory/os:windows/?q=sharppcap 具体使用详细步骤: http://www.co ...

  8. Objective-C命名编写规范

    There are only two hard things in Computer Science: cache invalidation and naming things. 在计算机科学中只有两 ...

  9. CTO俱乐部下午茶:技术团队管理中的那些事儿

    摘要:"CTO下午茶"是一种有效的集体对话的模式,参加活动的成员在真诚互动和共同学习的宗旨下齐聚一堂,在喝茶聊天氛围下交流工作心得.本期"CTO下午茶"的主题是 ...

  10. Regex Failure - Bug Fixing #2

    http://www.codewars.com/kata/55c423ecf847fbcba100002b/train/csharp Oh no, Timmy's received some hate ...