前段时间通过网上查找,使用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. 开博缘由 , 可点下看看 http://www.cnblogs.com/jshare

    记录日常用中用到.遇到的问题 实现过程,仅供参考 不定时更新 ------------------- 之前看过一个文章,大概说的是开发和用到的过的代码,可以提取出一些代码片段,长时间下来,你会发现部分 ...

  2. 微服务架构之spring cloud feign

    在spring cloud ribbon中我们用RestTemplate实现了服务调用,可以看到我们还是需要配置服务名称,调用的方法 等等,其实spring cloud提供了更优雅的服务调用方式,就是 ...

  3. Spring IOC (DI-依赖注入)

    看到一篇文章,讲Spring的依赖注入讲的很好理解,也很容易理解,非常详细.原文地址: https://blog.csdn.net/javazejian/article/details/5456130 ...

  4. 个人总结-7- 实现图片在MySQL数据库中的存储,取出以及显示在jsp页面上

    昨天主要是进行对数据库的内容提取出来并进行动态显示,这个只需要设置一个servlet从数据库中获取数据即可,只是图片比较特殊,不能显示. 今天准备继续找方法来实现图片得录入和显示到jsp中,准备从网上 ...

  5. 上传通用化 VHD 并使用它在 Azure 中创建新 VM

    本主题逐步讲解如何使用 PowerShell 将通用化 VM 的 VHD 上传到 Azure.从该 VHD 创建映像,然后从该映像创建新 VM. 可以上传从本地虚拟化工具或其他云导出的 VHD. 对新 ...

  6. java笔记--多线程基础

    多线程技术 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3889579.html  "谢谢-- 在java中实现多线程技术 ...

  7. POP动画[1]

    POP动画[1] pop动画是facebook扩展CoreAnimation的,使用及其方便:) 1:Spring系列的弹簧效果(两个动画kPOPLayerBounds与kPOPLayerCorner ...

  8. 一些实用的adb命令

    一.前提: 1.打开手机调试模式,确保手机已正常连接电脑,可在电脑上通过adb devices命令查看,结果如下说明连接成功: List of devices attached90xxxxc9 dev ...

  9. Mof提权科普

    今天再拿一个站的时候遇到了很多问题,拿站的过程就不说了,其中要用到mof提权,不管能不能提下,我进行一个mof提权的科普 这里我综合各类mof提权进行了 综合 首先说一下,无shell情况下的mysq ...

  10. 基础知识:Promise(整理)

    基础知识:Promise(整理) (来自牛客网)下面关于promise的说法中,错误的是(D) A. resolve和reject都是直接生成一个进入相应状态的promise对象,其参数就是进入相应状 ...