如果我有两个查询功能(都是返回集合):1.查询用户信息。2.查询新闻信息。这样查询的除了sql语句和返回集合的泛型不同,其他都是一样的,本人想简化下代码,将共同的部分提取出来?请问有什么办法,对于查询不同的sql语句,返回不同的泛型集合,怎么去控制这个泛型呢?有一个小小的思路就是通过反射,但是能根据不同的sql语句查询不同的信息,但是返回的泛型集合有不同。C#ADO.NET

解决方案 »

  1.   

    反射就很好。如果你担心反射性能不行,在.NET 4.0以上版本,可以借助Expression.MemberAccess构造Lambda去赋值,它在IL层面上翻译为直接对属性的操作,比反射快很多。
      

  2.   

    从sp兄那学来的: public IEnumerable<T> ExecuteQuery<T>(string sql, DbParameter[] ps, Func<DbDataReader, T> proc)
            {
                var str = "Data Source=.;Initial Catalog=TestDB;Integrated Security=True";            using (DbConnection con = new SqlConnection(str))
                {
                    con.Open();
                    var cmd = con.CreateCommand();
                    cmd.CommandText = sql;
                    if (ps != null)
                        cmd.Parameters.AddRange(ps);
                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                        yield return proc(reader);
                }
            }
    var list = ExecuteQuery(sql, null, reader =>
                    {
                        return new Class1 { ID = (int)reader["ID"], Name = (string)reader["Name"], Data = (string)reader["Data"] };                });
      

  3.   

    反射是很好,但是我不是很会用,如果根据传递sql语句查询不同返回的集合泛型也不同,那我这个泛型应该怎么办?
      

  4.   

    我有点看不懂你这用到Lambda表达式了。但是我感觉你这思路还是能明白的,可能有点深吧