+ -
当前位置:首页 → 问答吧 → 分享一个获取List<model>的dbHelper类部分代码。

分享一个获取List<model>的dbHelper类部分代码。

时间:2011-12-14

来源:互联网

C# code
 public static class GetGenericObject<T, K>
        where T : new()
        where K : IDataReader
    {
        /// <summary>
        /// 返回对象
        /// </summary>
        /// <param name="dataReader"></param>
        /// <returns></returns>
        public static T GetObject(K dataReader)
        {
            T newInstance = Activator.CreateInstance<T>();
            if (dataReader.Read())
            {
                SetModelValue(dataReader, newInstance);
            }
            dataReader.Close();
            return newInstance;
        }


        /// <summary>
        /// 返回列表。
        /// </summary>
        /// <param name="dataReader"></param>
        /// <returns></returns>
        public static IList<T> GetObjectList(K dataReader)
        {
            IList<T> objectLists = new List<T>();
            while (dataReader.Read())
            {
                T newInstance = Activator.CreateInstance<T>();
                SetModelValue(dataReader, newInstance);

                objectLists.Add(newInstance);
            }
            dataReader.Close();

            return objectLists;
        }

        private static void SetModelValue(K dataReader, T newInstance)
        {
            Type type = newInstance.GetType();
            PropertyInfo[] properties = type.GetProperties();
            foreach (PropertyInfo pi in properties)
            {
                if (CheckDataReader(dataReader, pi.Name))
                    pi.SetValue(newInstance, dataReader[pi.Name], null);
            }
        }

        private static bool CheckDataReader(K dataReader, string fieldName)
        {
            int fields = dataReader.FieldCount;
            bool state = false;
            for (int i = 0; i < fields; i++)
            {
                if (dataReader.GetName(i) == fieldName)
                    if (dataReader[i] != null && dataReader[i] != DBNull.Value)
                        state = true;
            }
            return state;
        }

    }

作者: a410787073   发布时间: 2011-12-14

现在用的是这个。

作者: a410787073   发布时间: 2011-12-14

该回复于2011-12-14 09:09:37被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#3楼 得分:0回复于:2011-12-14 09:17:21
感谢楼主的分享精神、UP!

作者: zy64891635   发布时间: 2011-12-14

作者: yuan521929   发布时间: 2011-12-14

该回复于2011-12-14 09:34:08被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#6楼 得分:0回复于:2011-12-14 09:29:36
T newInstance = Activator.CreateInstance<T>();

这句有必要?

你都有new()的约束了,还反射创建?

直接T newInstance = new T();

不就行了

作者: q107770540   发布时间: 2011-12-14

考虑过运行效率吗?如果把这个当作数据库访问的基础方法,效率会令人难以接受。

作者: zy64891635   发布时间: 2011-12-14

引用 6 楼 nqicecoffee 的回复:
T newInstance = Activator.CreateInstance<T>();

这句有必要?

你都有new()的约束了,还反射创建?

直接T newInstance = new T();

不就行了
进步于细节中支持。分享值得拥有。

作者: NqIceCoffee   发布时间: 2011-12-14

感谢楼主的分享精神、UP!

作者: orain   发布时间: 2011-12-14

引用 6 楼 nqicecoffee 的回复:
T newInstance = Activator.CreateInstance<T>();

这句有必要?

你都有new()的约束了,还反射创建?

直接T newInstance = new T();

不就行了

本质上是一样的

PropertyInfo[] properties = type.GetProperties();这个其实可以作为类的一个字段来用
放在SetModelValue里面,如果纪录比较多,每行都得反射一次,会影响性能

作者: dongt1   发布时间: 2011-12-14

额。。。。嗯。好的。以后改进下。

作者: courdom   发布时间: 2011-12-14

C# code

PropertyInfo[] properties = type.GetProperties();
while (dataReader.Read())
{
.....
}


在外反射一次就好了

作者: dongxinxi   发布时间: 2011-12-14