通过反射填充泛型集合List的静态方法

集合|静态

呃```花了一晚上时间,终于搞出来了如何通过反射,从DataReader将数据填充到数据实体泛型集合的静态方法.

//Kchen.Core.BaseBusinessObject为通用数据实体类,此处仅为限定T所继承的类型
        public static IList<T> FillDataListGeneric<T>(System.Data.IDataReader reader) where T : Kchen.Core.BaseBusinessObject
        {
            //实例化一个List<>泛型集合
            IList<T> DataList = new List<T>();
            while (reader.Read())
            {
                //由于是是未知的类型,所以必须通过Activator.CreateInstance<T>()方法来依据T的类型动态创建数据实体对象
                T RowInstance = Activator.CreateInstance<T>();
                //通过反射取得对象所有的Property
                foreach (PropertyInfo Property in typeof(T).GetProperties())
                {
                    //BindingFieldAttribute为自定义的Attribute,用于与数据库字段进行绑定
                    foreach (BindingFieldAttribute FieldAttr in Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
                    {
                        try
                        {
                            //取得当前数据库字段的顺序
                            int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
                            if (reader.GetValue(Ordinal) != DBNull.Value)
                            {
                                //将DataReader读取出来的数据填充到对象实体的属性里
                                Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
                            }
                        }
                        catch
                        {
                            break;
                        }
                    }
                }
                //将数据实体对象add到泛型集合中
                DataList.Add(RowInstance);
            }
            return DataList;
        }
调用的时候使用如下代码

            //伪代码 OleDbDataReader _ds = 创建一个OleDbDataReader
            IList<Product> _result = Kchen.Utilities.FillDataListGeneric<Product>(_ds);

此静态方法通过一个实体类型和DateReader,快速的将数据填充到数据实体泛型集合中.

时间: 2024-11-08 18:43:52

通过反射填充泛型集合List的静态方法的相关文章

asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法_实用技巧

本文实例讲述了asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法.分享给大家供大家参考,具体如下: 这是初级的,很简单,牛人可以不看了.不过还算实用. 在项目中经常需要处理表单,给model赋值,很烦人的一些重复代码.如下边的代码: News news = new News(); news.Id = int.Parse(Request.Form["Id"]); news.Category = int.Parse(Request.Form["Catego

DataTable填充实体类返回泛型集合

     昨天找坤哥看到我的一段代码,如下:           稍微解释下,这段代码时D层查询结束后,将datatable查询到的结果赋值给实体对象的属性,然后返回实体的过程,坤哥看了之后问我,如果实体有500多个属性,难道也要这样一条一条的写吗?如果返回多个实体时怎么办?这时,我才意识到自己的代码时非常有问题的,原来设计的是每个方法最多返回一个实体,但是当遇到查询到多条记录的时候,就又冒着破坏三层结构的事返回Datatable去了,真的是很有问题啊.      怎么改,我脑海中一下子就浮现了

C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法_C#教程

在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的所有成员,也就意味着可以替不同的类型,创建更通用的方法.这个例子是这样做的:利用反射,读取一个类型的所有属性,然后再把属性转换成XML元素的属性或者子元素.下面注释比较完整,就话不多说了,有需要看代码吧! using System; using System.Collections.Generic;

[工具类]DataTable与泛型集合List互转

写在前面 工作中经常遇到datatable与list,对于datatable而言操作起来不太方便.所以有的时候还是非常希望通过泛型集合来进行操作的.所以这里就封装了一个扩展类.也方便使用. 类 方法中主要使用了反射的方式动态的为属性赋值以及取值. public static class Extension { /// <summary> /// 将datatable转换为泛型集合 /// </summary> /// <typeparam name="TEntity

关于datatable转化为对象数组或泛型集合的性能问题

问题描述 1.如果用datatable返回数据,绑定到页面用eval("字段"),相当的麻烦,得写每一字段:(不会自动感应)2.如果用sqldatareader取出数据装入一个对象数组,页面就就可以用对象[索引].属性来访问数据,貌似很灵活,但问题是就不能使用datatable封装的方法来进行计算,得手工写N多SQL:3.如果用datatable回传数据,然后把datatable转化为对象数组或泛型集合,然后页面中就可以使用 对象[索引].属性来访问数据,并且也可以正常使用datata

C#中把任意类型的泛型集合转换成SQLXML数据格式的实例_C#教程

话不多说,跟着小编一起来看下吧 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlTypes; using System.Data; using System.Reflection; using System.IO; using System.Xml; namespace CollectionToXml { class Program

编写高质量代码改善C#程序的建议:泛型集合、选择集合和集合的安全

前言 软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行. 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议20.使用泛型集合来替代非泛型集合 建议21.选择正确的集合 建议22.确保集合的线性安全 建议

泛型--集合接口

9.4 集合接口 .NET Framework为集合的枚举和对比提供了两组标准接口:传统的(非类型安全)和新的泛型类型安全集合.本书只聚焦于新的,类型安全的集合接口,因为它更优越. 您可以声明一些指定了类型的ICollection来取代实际类型(如int或string),以用于接口声明中的泛型类型(<T>). C++程序员需要注意:C#泛型和C++中的模板在语法和用法上都很相似.但是,因为泛型在运行期为其指定类型进行扩展,JIT编译器可以为它们的不同的实例共享一段代码,从而使得在使用C++模板

Linq学习(7) 延迟执行 &amp;amp; 查询非泛型集合

本篇介绍Linq的延迟执行和查询非泛型集合. 延迟执行 从Linq的查询过程看,不断有新类型.集合的构建.释放,感觉效率不高,但Linq的延迟执行机制将大大改善常规操作加载整个数据源导致的效率低下的状况. 示例: static void Main() { int[] collection = { 10, 11, 12, 13, 14 }; Console.WriteLine("Begin query collection:" + DateTime.Now); var result =