C#利用反射将Datatable转化为指定实体类List<T>

这篇博客介绍了如何在C#中使用反射将Datatable转换为指定的实体类List<T>,以提高数据操作效率和程序的可维护性。作者指出,直接操作Datatable效率低下且不利于扩展,而通过实体类可以简化数据操作。文中提供了两个扩展方法的代码示例,分别用于直接转化和委托筛选后的转化。
摘要由CSDN通过智能技术生成

背景介绍

          在软件开发中肯定免不了和数据库打交道,我们对数据的增删改查最终会转化为SQL在数据库中执行。从SQLServer中查出数据一般有两种方式:一是ADO.NET直接写SQL语句从数据中查出数据,另一种是利用ORM框架得到数据。ADO.NET作为传统的数据库对接方式现在貌似已经不怎么流行了。让程序员直接写SQL实现增删改查功能存在一定和风险并且在程序中写SQL非常不利于程序的扩展和维护,也不利于数据库的维护和更换,极大的增加了程序的不稳定性。

          其二、利用传统的ADO.NET Datatable的数据操作语法十分繁琐,并且装箱拆箱的效率十分低下,因此,对数据的操作应该使用实体类。那么问题来了,对于那些由于各种原因还没有利用起ORM框架,但是想利用实体类进行数据操作的程序,我们只需要将Datatable中的数据转化为实体类,便可实现。废话不多说,代码如下所示:

public static class DatatableExtension
{
        /// <summary>
        /// 将Datatable转化为指定实体类
        /// </summary>
        /// <typeparam name="T">实体类对象类型</typeparam>
        /// <param name="_sourceTable">源DataTable</param>
        /// <returns>返回转化后的DataTable</returns>
        public static List<T> ToList<T>(this DataTable _sourceTable) where T : new()
        {
            var resultLists = new List<T>();
            var pi = typeof(T).GetProperties(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly).ToList();
            if (_sourceTable == null || pi == null || pi.Count == 0)
            {
                //DataTable为null或实体类无属性则返回空的实体类
            }
            else
            {
                var wildColumnsLists = new List<string>();//用于存放无法找到对应实体类属性的列,无后续操作
                var piFlagLists = new List<Tuple<PropertyInfo, bool>>();//用于存放找到对应实体类属性的列,二元组T1是列的数据类型,T2是类型是否和实体类是否相等
                foreach (DataColumn col in _sourceTable.Columns)
                {
                    if (pi.Exists(p => p.Name.Equals(col.ColumnName)))
                    {
                        var prop = pi.FirstOrDefault
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值