我做一个通用的获取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来填充数据。
请各位高手指条明路,最好明确指出应该怎么写。另外由于业务需要必须如此来实现,换成其它的实现方式暂时不在本文考虑的范围。
请教各位专家应该怎么改写这个方法,使它可以支持通过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来填充数据。
请各位高手指条明路,最好明确指出应该怎么写。另外由于业务需要必须如此来实现,换成其它的实现方式暂时不在本文考虑的范围。
ls代码就是段关系映射,现在的实体类自己根据Reader赋值,
但我想如果交给一个第3方的Buidler类,Factory类改造下,
实体类代码可以把赋值的逻辑分离出去。(当然还是用到反射技术)
构造函数可以无参,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;
}
{
list.Add(new T{Reader= reader});
}
多谢etudiant6666兄的热心帮助,我很认同你的说法,简单是有代价的,经过慎重考虑弃用此方式,虽然通用性强但是造成的额外资源耗费得不偿失