老虎下山

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

以前在开发一个系统的时候

小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中

 

你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?

 

下面是一个以前的读取数据库 信息的例子

public IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p)
        {
            SqlDataReader dr = null;
            string table = "QAS_V_MessageInfo";
            string orderby = "QuestionTime";
            IList<KFS_Model.QAS_V_MessageInfo> list = new List<KFS_Model.QAS_V_MessageInfo>();
            Pagination.page(table, where, orderby, true,p);
            dr = Pagination.page(table, where, orderby, false, p);
            while (dr.Read())
            {
                KFS_Model.QAS_V_MessageInfo qas = new KFS_Model.QAS_V_MessageInfo();
                qas.UserId = dr.GetGuid(1);
                qas.UserName = dr.GetString(2);
                qas.SonModelId = dr.GetGuid(3);
                qas.SonModelName = dr.GetString(4);
                qas.QuestionId = dr.GetGuid(5);
                qas.QuestionTitle = dr.GetString(6);
                qas.QuestionUrl = dr.GetString(7);
                qas.QuestionTime = dr.GetDateTime(8);
                qas.QuestionSession = dr.GetInt32(9); 
                qas.QuestionContent = dr.GetString(10);
                qas.FatherModelId = dr.GetGuid(11);
                list.Add(qas);
            }
            return list;            
        }

 

 
赋值语句占了方法的一半

而且写起来还要一个一个的对照

 

很郁闷的说

 

下面就是我今天公布的源码  无任何版权  欢迎转载

 

首先构造一个泛型类

 

 

public class ClassName<T>

{

 

}

 

然后定义一个方法 方法返回集合

 

    public class Class1<T>
    {
        public IList<T> GetData(SqlDataReader reader)
        {
            IList<T> list = new List<T>();
            Type type = typeof(T);
            PropertyInfo[] properties = type.GetProperties();

            while (reader.Read())
            {
                T t = Activator.CreateInstance<T>();
                for (int i = 0; i < properties.Length; i++)
                {
                    properties[i].SetValue(t, reader[i + 1], null);

                }

                list.Add(t);
            }

            return list;
        }
    }

 

 

上面给出了核心代码 如果你要传递sql语句

那你的业务逻辑层 就要这一个方法也就够了!

 

 

 

 下面一个扩展方法 由 论坛的sql1234提供 在一次感叹 linq语法的简洁

public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new()
{
    var fs = (from fd in typeof(T).GetFields()
                let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) }
                where desc.index >= 0
                select desc)
            .ToList();
    foreach (var x in rd)
    {
        var obj = new T();
        fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });
        yield return obj;
    }
}

 

 

这里,我们通过扩展方法,为任意DbDataReader都增加了一个GetObjects方法,返回任意指定类型的强类型的对象集合。
如果包括private的field才更完整。应该将 GetFields() 修改为
GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)

posted on 2012-06-12 21:30  老虎下山  阅读(2135)  评论(13编辑  收藏  举报