前段时间通过网上查找,使用emit将Datatable,DataReader转换成List<T>了。这是从数据库到展示。

但是最近整理Hikari(我写的数据库连接池),发现c#里面数据库客户端驱动一般会提供一个BulkCopy的类,一般接口是DataTable,可以批量插入。所以又研究了如何把List<T>转DataTable.

一般方法是全部反射,我就不说了。这里只说emit,记录下下次用。

这里创建动态方法(委托)有个范围问题。我举个例子

假如有Pseron类。

public class Person

    {

        public string Name { get; set; }

        public int Age { get; set; }

        public int Score { get; set; }

    }

1.方法是这样的

public static void PersonToDataRow(Person person, DataTable dt)

        {

            DataRow row=  dt.NewRow();

            row["Name"] = person.Name;

            row["Age"] = person.Age;

            row["Score"] = person.Score;

            dt.Rows.Add(row);

        }

2.方法是这样的

public static void PersonToDataRow(Person person, DataRow row)

        {

          

            row["Name"] = person.Name;

            row["Age"] = person.Age;

            row["Score"] = person.Score;

        }

这两种就有范围问题。

第一类创建动态方法代码如下:

需要有一个委托定义: public delegate void LoadDataRow<T>(T obj,DataTable dr);

创建代码

 public static DynamicMethod ConvertDataRow<T>()
{
DynamicMethod method = new DynamicMethod(typeof(T).Name+"ToDataRow", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, null,
new Type[] { typeof(T), typeof(DataRow) }, typeof(EntityContext).Module, true);
ILGenerator generator = method.GetILGenerator();
LocalBuilder reslut = generator.DeclareLocal(typeof(DataRow));
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Call, typeof(DataTable).GetMethod("NewRow"));
generator.Emit(OpCodes.Stloc, reslut);
foreach (var p in typeof(T).GetProperties())
{
generator.Emit(OpCodes.Ldloc, reslut); generator.Emit(OpCodes.Ldstr, p.Name);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Call, p.GetGetMethod());//
if (p.PropertyType.IsValueType)
generator.Emit(OpCodes.Box, p.PropertyType);//一直在折腾这个地方,哎
else
generator.Emit(OpCodes.Castclass, p.PropertyType); generator.Emit(OpCodes.Call, typeof(DataRow).GetMethod("set_Item", new Type[] { typeof(string), typeof(object) }));
}
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Call, typeof(DataTable).GetMethod("get_Rows"));
generator.Emit(OpCodes.Ldloc, reslut);
generator.Emit(OpCodes.Call, typeof(DataRowCollection).GetMethod("Add", new Type[] { typeof(DataRow) }));
generator.Emit(OpCodes.Ret); return method; }

调用上面代码创建委托即可。

第二类创建代码:

需要定义一个委托:public delegate void EntityToRow<T>(T obj, DataRow row);

创建代码:

  private static DynamicMethod BuildMethodToRow<T>()
{
DynamicMethod method = new DynamicMethod(typeof(T).Name+ "ConvertToDataRow", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard,null,
new Type[] { typeof(T),typeof(DataRow) }, typeof(EntityContext).Module, true);
ILGenerator generator = method.GetILGenerator();
foreach (var p in typeof(T).GetProperties())
{
var endIfLabel = generator.DefineLabel();
generator.Emit(OpCodes.Ldarg_1);
generator.Emit(OpCodes.Ldstr, p.Name);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Call, p.GetGetMethod());//获取
if (p.PropertyType.IsValueType || p.PropertyType == typeof(string))
generator.Emit(OpCodes.Box,p.PropertyType);//装箱
else
generator.Emit(OpCodes.Castclass, p.PropertyType);
generator.Emit(OpCodes.Call, dataRowAssembly.SetValueMethod);
}
generator.Emit(OpCodes.Ret);
return method;
}

调用上面代码创建委托即可。

c#将List转换成DataTable(采用Emit)的更多相关文章

  1. c#将List转换成DataTable

    前面写了一篇List<T>转换成DataTable,这里主要是完善了前面的代码. 同样使用了emit,我把代码整理后上传了git. 另外增加了特性的设计. 设计了三类特性ColumnTyp ...

  2. 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel

    步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...

  3. C#_List转换成DataTable

    /// <summary> /// 讲list集合转换成datatable /// </summary> /// <param name="list" ...

  4. 将List转换成DataTable

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  5. list转换成DataTable

    list转换成DataTable类如下: public static DataTable ToDataTable<T>(this IList<T> datas) { DataT ...

  6. 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

    领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...

  7. C# DataTable转换成实体列表 与 实体列表转换成DataTable

    /// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T"&g ...

  8. 获取报告 Stream转string,利用字符串分割转换成DataTable

    protected void Button1_Click(object sender, EventArgs e) { MemoryStream stream = new MemoryStream(); ...

  9. C#:CsvReader读取.CSV文件并转换成DataTable

    原文引用:https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader using LumenWorks.Framework.IO.Csv; ...

  10. 将泛类型集合List类转换成DataTable

    /// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...

随机推荐

  1. MySQL允许root远程访问

    1. mysql -u root -p;     // 登录mysql, 并输入密码 2. use mysql;             // 打开 mysql 数据库 3. update user ...

  2. centos下安装ipython(minglnghang命令行)

    下载文件 wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 执行安装 python get-pip.py 这就安装好了 ...

  3. VUE知识day3_vue-cli脚手架安装和webpack模板项目生成

    ue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一.安 ...

  4. C#模拟HTTP POST 请求

    GET请求: /// <summary> /// 获取accessToken /// </summary> /// <param name="corpid&qu ...

  5. sql server2008安装时提示重启计算机失败怎么办?

    在键盘上按下组合键[Win]+[R],调出运行窗口. 在窗口中输入“regedit”,点击确定,打开注册表管理界面. 在注册表左侧目录栏中找到如下位置:“HKEY_LOCAL_MACHINE\SYST ...

  6. ActiveMQ5.8.0安装及启动

    一.下载 官网地址:http://activemq.apache.org/download.html Windows版本:apache-activemq-5.8.0-bin.zip Linux版本:a ...

  7. 找工作笔试面试那些事儿(13)---操作系统常考知识点总结 ZZ 【操作系统】

    http://blog.csdn.net/han_xiaoyang/article/details/11285485 上一节对数据库的知识做了一个小总结,实际找工作过程中,因为公司或单位侧重点不一样, ...

  8. SQL 常用语法

    一.SQL分类 DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRA ...

  9. 二、Asp.Net Core WebAPI——OcelotDemo

    项目源码OcelotDemo 基础知识在教程或者官网文档查看 Ocelot源码 基于.NET平台的Ocelot网关框架教程汇总 这篇文章不错. 这里我只写我想说的 项目结构 API1和API2是测试的 ...

  10. 五、python小功能记录——打包程序

    使用pyinstaller打包Python程序 安装工具 :pip3 install pyinstaller 在Python程序文件夹上(不点进去)按住shift并且右键,在弹出的选项中点击" ...