我做一个通用的获取IList的方法,由于是通用的,所以需要使用泛型实体,各个实体本身new的时候有构造函数,是有通过reader来填充实体,但是在使用泛型实体的时候就无法带参数来new这个实体。
请教各位专家应该怎么改写这个方法,使它可以支持通过new的时候把reader参数带进去。该方法代码:
public IList<T> GetStandardList<T>(string SqlStr) where T : BaseModel,new()
{
            IDataReader reader=getReader(SqlStr);
            IList<T> list = new List<T>();
            while (reader.Read())
            {
                list.Add(new T(reader));
            }
            reader.Close();
            return list;
}调用的方法:
IList<WaybillEntity> list = GetStandardList<WaybillEntity>(SqlStr);WaybillEntity中有构造函数:
       /// <summary>
        /// 构造函数: 根据IDataReader填充Waybill数据实体
        /// </summary>
        /// <param name="reader">IDataReader对象</param>
        public WaybillEntity(IDataReader reader)
            : base(reader)
        {
            DataReaderParser parser = new DataReaderParser(reader);
            this.Wbid = parser.Get<int>("Wbid");
            this.Wbcode = parser.Get<string>("Wbcode");
         }基类中也有相应的构造函数
        public BaseModel(IDataReader reader)
        {
            this.IsNewModel = false;
        }   所有的T实际上都有以IDataReader 为参数的构造函数,我看了很多资料,也参考了C#泛型构造函数约束,但是尚无法明了到底该怎么写才可以调用IDataReader 的构造函数为T来填充数据。
   请各位高手指条明路,最好明确指出应该怎么写。另外由于业务需要必须如此来实现,换成其它的实现方式暂时不在本文考虑的范围。

解决方案 »

  1.   

    new T(reader) 这个地方改为 Activator.CreateInstance() 反射构造没什么不好吧。
      

  2.   

    list.Add(Activator.CreateInstance(typeof(T), reader) as T);
      

  3.   

    又看了下:
    ls代码就是段关系映射,现在的实体类自己根据Reader赋值,
    但我想如果交给一个第3方的Buidler类,Factory类改造下,
    实体类代码可以把赋值的逻辑分离出去。(当然还是用到反射技术)
      

  4.   

    没太理解你的意思,不过貌似所有的T都继承一个基类BASET, 在基类中具有一个对IDataReader赋值的方法可以解决问题,不一定非要在构造函数中赋值的吧。
      

  5.   

    我来个简单的
    构造函数可以无参,reader可以来个void setreader(IDataReader reader)的方法传进去.
    然后public IList<T> GetStandardList<T>(string SqlStr) where T : BaseModel,new()
    {
      IDataReader reader=getReader(SqlStr);
      IList<T> list = new List<T>();
      while (reader.Read())
      {
      //list.Add(new T(reader));
      T item = new T();
      item.SetReader(reader);
      list.Add(item);//楼主懂得
      }
      reader.Close();
      return list;
    }
      

  6.   

    假设不是定义为方法,而是定义为属性,那么使用起来可以更简单一点:  while (reader.Read())
      {
      list.Add(new T{Reader= reader});
      }
      

  7.   

    感谢 ojlovecd  给出的方法简洁明确,直接命中。就是我需要的
      

  8.   


    多谢etudiant6666兄的热心帮助,我很认同你的说法,简单是有代价的,经过慎重考虑弃用此方式,虽然通用性强但是造成的额外资源耗费得不偿失