将任意类型的List泛型实体类集合,转换为DataTable数据集

对于参数类型的判断,可以自己扩展一下。
代码中给出了注释,这里就不对代码过多讲述。

/// <summary>
    /// DAL层帮助类,ADO .NET参数化数据操作,可变T类型参数帮助类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DalGenericityHelper<T>
    {
        /// <summary>
        /// 将List实体类集合转为DataTable
        /// </summary>
        /// <param name="inputList">传入的集合</param>
        /// <returns></returns>
        public static DataTable ConvertToDataTable(List<T> inputList)
        {
            //用于存放实体类转换过来的数据表
            DataTable dataTable = new();
            Type questionType = typeof(T);
            //获取类的所有属性
            PropertyInfo[] propertyInfos = questionType.GetProperties();
            //存放DataTable的列集合
            DataColumn[] dataColumns = new DataColumn[propertyInfos.Length];
            //自增下标,用来从获取的属性集合中去出数据
            int listIndex = 0;
            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                //不实例化,当前下标的只为null,不可操作
                dataColumns[listIndex] = new DataColumn();
                //设置表格中这一列的名称和数据类型
                dataColumns[listIndex].ColumnName = propertyInfo.Name;//属性名称
                //属性的数据类型,如果是int?类型,赋值会出错,所以需要判断一下
                dataColumns[listIndex].DataType = propertyInfo.PropertyType == typeof(int?) ? typeof(int) : propertyInfo.PropertyType;
                //判断自增下标
                if (listIndex == propertyInfos.Length - 1)
                {
                    break;
                }
                else
                {
                    listIndex++;
                }
            }
            //将设置的列集合加入到DataTable表格
            dataTable.Columns.AddRange(dataColumns);
            //遍历实体类集合
            foreach (var tempInput in inputList)
            {
                //生成新的一行
                DataRow dataRow = dataTable.NewRow();
                //遍历实体类属性等的集合,通过属性名称和类型获取实体类指定属性值
                foreach (PropertyInfo peroperty in propertyInfos)
                {
                    //特殊参数的处理,方便数据库存储
                    //bool类型转为int
                    if (peroperty.PropertyType == typeof(bool))
                    {
                        //获取值,为空默认false
                        object objectValue = peroperty.GetValue(tempInput) ?? "false";
                        //类型转换判断并赋值
                        bool judgeIsBool = Convert.ToBoolean(objectValue);
                        dataRow[peroperty.Name] = judgeIsBool ? 1 : 0;
                    }
                    //List<string>转为字符串,方便数据库存储
                    //propertyType.IsGenericType():判断属性类型是否为泛型类型的布尔值
                    //propertyType.GetGenericTypeDefinition():用于获取泛型类型的定义
                    else if (peroperty.PropertyType.IsGenericType && peroperty.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
                    {
                        //动态获取值
                        object objectValue = peroperty.GetValue(tempInput) ?? new List<string>();
                        List<string>? tempIsList = objectValue as List<string>;
                        //利用封装的方法转换为字符串,等同于JsonConvert.SerializeObject()
                        dataRow[peroperty.Name] = DalHelper.ConvertListToString(tempIsList);
                    }
                    //int?类型,值为null了,无法进行存储
                    else if (peroperty.PropertyType == typeof(int?))
                    {
                        //无其他特殊的类型存储,则直接进行获取、赋值
                        dataRow[peroperty.Name] = peroperty.GetValue(tempInput) ?? 0;
                    }
                    else
                    {
                        //无其他特殊的类型存储,则直接进行获取、赋值
                        dataRow[peroperty.Name] = peroperty.GetValue(tempInput);
                    }
                }
                dataTable.Rows.Add(dataRow);
            }
            return dataTable;
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MissyouCYYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值