`
kevinhrw
  • 浏览: 187511 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C# DataReader反射获取实体类

    博客分类:
  • C#
阅读更多
在网上查了一下,发现有些人写的效率不高.自己修改了一下.
根据select出来的字段去反射.

        public static T ReaderToModel<T>(IDataReader dr)
        {
            try
            {
                using (dr)
                {
                    if (dr.Read())
                    {
                        Type modelType = typeof(T);
                        T model = Activator.CreateInstance<T>();
                        for (int i = 0; i < dr.FieldCount; i++)
                        {
                            PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
                            pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
                        }
                        return model;
                    }
                }
                return default(T);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static List<T> ReaderToList<T>(IDataReader dr)
        {
            using (dr)
            {               
                List<T> list = new List<T>();
                Type modelType = typeof(T);
                while (dr.Read())
                {
                    T model = Activator.CreateInstance<T>();
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        PropertyInfo pi = modelType.GetProperty(GetPropertyName(dr.GetName(i)));
                        pi.SetValue(model, HackType(dr[i], pi.PropertyType), null);
                    }
                    list.Add(model);
                }
                return list;
            }
        }
        //这个类对可空类型进行判断转换,要不然会报错
        private static object HackType(object value, Type conversionType)
        {
            if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
            {
                if (value == null)
                    return null;

                System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
                conversionType = nullableConverter.UnderlyingType;
            }
            return Convert.ChangeType(value, conversionType);
        }

        private static bool IsNullOrDBNull(object obj)
        {
            return ((obj is DBNull) || string.IsNullOrEmpty(obj.ToString())) ? true : false;
        }

        //取得DB的列对应bean的属性名
        private static string GetPropertyName(string column)
        {
            column = column.ToLower();
            string[] narr = column.Split('_');
            column = "";
            for (int i = 0; i < narr.Length; i++)
            {
                if (narr[i].Length > 1)
                {
                    column += narr[i].Substring(0, 1).ToUpper() + narr[i].Substring(1);
                }
                else
                {
                    column += narr[i].Substring(0, 1).ToUpper();
                }
            }
            return column;
        }
分享到:
评论

相关推荐

    DataReader反射泛型实体对象

    DataReader反射泛型实体对象。数据库已有。完整的例子。

    DataReader实体转换(支持复杂对象)

    高效的处理DataReader转化为实体对象。 支持发杂对象,如: Class A { public int x; public B y; } Class B { public int z; }

    C#中DataReader之應用

    SqlDataReader形成的是数据流,并且数据流是以只进且只读的形式。我们可以形容它向一股瀑布一样,只往前进。

    C#使用ExecuteReader返回DataReader

    C#使用ExecuteReader返回DataReader既有查询结果集又有输出参数和返回值的使用注意事项

    把DataReader转换成DataTable的方法

    把DataReader转换成DataTable的方法 把DataReader转换成DataTable的方法

    C#的Json操作类,支持数组,DataTable,DataReader等转Json

    C#的Json操作类,支持数组,DataTable,DataReader等转Json

    DataReader实体自动映射.txt

    DataReader实体自动映射

    C# 各种helper类

    C#下的各种helper类的集合,放在一个可执行的vs项目里,具体有string,ftp,file,excel,md5,datatable,datareader,xml,enum等等

    C# FireBird 工具类

    C# FireBird 工具类 封装对FireBird数据库的所有操作,例如建立连接,返回DataSet,返回DataReader等

    C# 各种通用类集合

    03.DataReader的辅助类 MyDataReaderHelper.cs 04.DataTable操作辅助类 MyDataTableHelper.cs 05.DateTime的辅助类 MyDateTimeHelper.cs 06.常用的目录操作辅助类 MyDirHelper.cs 07.枚举操作辅助类 MyEnumHelper ...

    C#SQL数据库操作通用类

    C#SQL数据库操作通用类,运行SQL语句。 运行SQL语句返回DataReader,SqlDataReader对象;生成Command对象;返回adapter对象;运行SQL语句,返回DataSet对象;返回SQL语句执行结果的第一行第一列;返回SQL语句第一列,...

    .NET中的DataReader简介

    在.NET中的DataReader简介 关于DataReader的使用简介,从其他地方转载的。

    c#数据库sqlserver连接公共类的实现

    包括最基本的方法: 打开数据库 关闭数据库 创建SqlCommand命令方法 执行SQL语句方法 将DataReader对象转换成DataTable对象方法

    DataTable和IList间转换的封装

    if (row != null) { obj = Activator.CreateInstance(); foreach (DataColumn column in row.Table.Columns) { PropertyInfo prop = obj.GetType().GetProperty(column.ColumnName); ... object value = row...

    C#基类库大全下载--苏飞版

    Mime实体帮助类 MimeHeaders mime的Header帮助类 MimeReader mime读取帮助类 QuotedPrintableEncoding mimeEncoding帮助类 9.PDF 转化类 PDFOperation PDFOperation--C#PDF文件操作帮助类 类主要功能有1....

    C# JSON通用转换类

    操作类中包含: 1. 过滤特殊字符 2. 格式化字符型、日期型、布尔型 3. List转换成Json 4. 对象转换为Json 5. 对象集合转换Json 6. 普通集合转换Json 7. DataSet转换为Json 8. Datatable转换为Json 9. DataReader转换...

    使用C#将DataReader转换为IEnumerable

    如何将任何数据读取器转换为通用列表。

    DataReader和DataSet的区别

    总结了一些DataReader和DataSet一些特征和用法上的区别

    C#基础类库

    C#基础类库 1.Chart图形 Assistant创建显示图像的标签和文件 OWCChart统计图的封装类 2.Cookie&Session;&Cache;缓存帮助类 CacheHelper C#操作缓存的帮助类,实现了怎么设置缓存,怎么取缓存,怎么清理缓存等...

    控制台程序【泛型+反射】

    提示:用DataReader去访问数据库,将得到的结果通过反射生成实体对象/集合返回; 4 封装一个方法,能控制台输出任意实体的全部属性和属性值; 5 进阶需求:提供泛型的数据库实体插入、实体更新、ID删除数据的数据库...

Global site tag (gtag.js) - Google Analytics