ppp5p

作者:蓝天 http://sky.newssc.org

分享一个泛型方法

本人基本不写博客,今天实在没什么事情,分享一个泛型方法,此泛型方法,如有不妥之处敬请谅解。先贴代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Reflection;
using Sky.DBUtility;

namespace Sky.Data
{
    public class CeShi
    {
        public static List<T> GetCommon<T>(string sql) where T : class
        {
            List<T> list = null;
            using (SqlDataReader reader = DbHelper.ExecuteReader(sql))
            {
                if (reader.HasRows)
                {
                    list = new List<T>();
                    int colNum = reader.FieldCount;
                    while (reader.Read())
                    {
                        T obj = Activator.CreateInstance<T>();
                        Type type = obj.GetType();
                        for (int i = 0; i < colNum; i++)
                        {
                            string fieldName = reader.GetName(i);
                            PropertyInfo pinfo = type.GetProperty(fieldName);
                            string typeName = reader.GetDataTypeName(i);
                            switch (typeName)
                            {
                                case "nvarchar":
                                    pinfo.SetValue(obj, reader.GetString(i), null);
                                    break;
                                case "int":
                                    pinfo.SetValue(obj, reader.GetInt32(i), null);
                                    break;
                            }
                        }
                        list.Add(obj);
                    }
                }
            }
            return list;
        }

    }

}

此方法还有不足之处,大家可以自己完善。

方法功能解释:我们经常需要查询数据,并且把查询数据返回一个实体类,方便操作,需要先得到一个SqlDataReader来循环给某个实体类赋值,感觉有时比较麻烦,尤其是数据库字段比较多的情况写起代码来非常的烦人。现在我们可以通过使用这个方法T对应我们的实体类,能过sql语句按照表字段来匹配对应的实体类的属性名,直接返回我们想要的实体方法。

如有疑问请发评论,感谢大家,第一次发贴言语组织上还有问题,望大家见谅。

新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

2011/9/9 15:54:15 | asp.net | |

#5游客[注册][60.208.74.*]2013/7/3 15:01:44
对象是放在堆里的,obj存放的是他的引用,你放到while之外,其实是一直修改的是一个对象,能不覆盖吗?
#4ppp5p2011/9/9 16:37:18
这种泛型方法我个人认为比较适合于mvc下面比较方便
#3ASP.NET MVC开发2011/9/9 16:25:34
看似只能是这样了,问题不大。
#2ppp5p2011/9/9 16:10:42
其实我刚开始的也是这样想,但是循环出来的值会被最后一次给覆盖
#1路过秋天2011/9/9 16:03:26
T obj = Activator.CreateInstance<T>();
Type type = obj.GetType();
这两个可以放到while之外,看似重复的类型,可以重复用。
  • 发表评论