zoukankan      html  css  js  c++  java
  • DataTable转换为List<Model>的通用类

    在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。

    所以很多人都是按照以下方式做的:

    // 获得查询结果
    DataTable dt = DbHelper.ExecuteDataTable(...);
    // 把DataTable转换为IList<UserInfo>
    IList<UserInfo> users = ConvertToUserInfo(dt);

      

    问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
    解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型

      

    不多说,核心代码如下,经过测试,性能不错,大家可以根据实际情况改善
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Reflection;

    namespace NCL.Data
    {
        
    /// <summary>
        
    /// 实体转换辅助类
        
    /// </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))
                        {
                            
    // 判断此属性是否有Setter
                            if (!pi.CanWrite) continue;

                            
    object value = dr[tempName];
                            
    if (value != DBNull.Value)
                                pi.SetValue(t, value, 
    null);
                        }
                    }

                    ts.Add(t);
                }

                
    return ts;

            }
        }
    }

    使用方式:

    // 获得查询结果
    DataTable dt = DbHelper.ExecuteDataTable(...);
    // 把DataTable转换为IList<UserInfo>
    IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);

      

    呵呵,这样子是不是很方便了,谢谢,希望能给你带来收获!

  • 相关阅读:
    COGS 14. [网络流24题] 搭配飞行员
    洛谷 P3376 【模板】网络最大流
    洛谷 P2936 [USACO09JAN]全流Total Flow
    codevs 2038 香甜的黄油 USACO
    codevs 1993 草地排水 USACO
    Openjudge 2.5 6264:走出迷宫
    洛谷 P1744 采购特价商品
    HDU
    中国剩余定理
    bzoj2157: 旅游
  • 原文地址:https://www.cnblogs.com/JoshuaDreaming/p/1969139.html
Copyright © 2011-2022 走看看