现在开发项目都用到3层架构,bll dal model 大量使用list来返回列表数据,
每次都需要手动写一堆代码把每行数据写到List中。
public class UserInfo
{
public string Age
{
get;
set;
}
public string Sex
{
get;
set;
}
}
```
List<UserInfo> UserInfoList= new List<UserInfo>
while(reader.Read())
{
UserInfo userinfo = new UserInfo();
userinfo.Age = reader["Age"].ToString();
userinfo.Sex= reader["Sex"].ToString();
UserInfoList.add(userinfo);
}
GridView1.DataSource = UserInfoList;
GridView1.DataBind()
这样写字段太多的话工作量太大了,有没有一种自动转到列的方法呢
代码可以也样写的
protected List<T> DataReaderToList<T>(SqlDataReader SDR) where T : class
{
List<T> ListData = new List<T>();
if (SDR.HasRows)
{
ListData.Clear();
while (SDR.Read())
{
object Obj = System.Activator.CreateInstance(typeof(T));
Type ObjType = Obj.GetType();
#region 一行数据赋值给一个对象
for (int i = 0; i < SDR.FieldCount; i++)
{
PropertyInfo PI = ObjType.GetProperty(SDR.GetName(i));
if (PI != null)
{
string PTName = PI.PropertyType.Name.ToString();
string FullName = PI.PropertyType.FullName;
string Name = PI.Name;
object Value = PI.GetValue(Obj, null);
switch (PI.PropertyType.ToString())
{
case "System.Int64":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt64(SDR[Name]), null);
break;
case "System.Byte[]":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : (byte[])SDR[Name], null);
break;
case "System.Boolean":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToBoolean(SDR[Name]), null);
break;
case "System.String":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToString(SDR[Name]), null);
break;
case "System.DateTime":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDateTime(SDR[Name]), null);
break;
case "System.Decimal":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDecimal(SDR[Name]), null);
break;
case "System.Double":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDouble(SDR[Name]), null);
break;
case "System.Int32":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt32(SDR[Name]), null);
break;
case "System.Single":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSingle(SDR[Name]), null);
break;
case "System.Byte":
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToByte(SDR[Name]), null);
break;
default:
int Chindex = PTName.IndexOf("Nullable");
if (FullName.IndexOf("System.Int64") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt64(SDR[Name]), null);
}
if (FullName.IndexOf("System.Boolean") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToBoolean(SDR[Name]), null);
}
if (FullName.IndexOf("System.String") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToString(SDR[Name]), null);
}
if (FullName.IndexOf("System.DateTime") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDateTime(SDR[Name]), null);
}
if (FullName.IndexOf("System.Decimal") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDecimal(SDR[Name]), null);
}
if (FullName.IndexOf("System.Double") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDouble(SDR[Name]), null);
}
if (FullName.IndexOf("System.Int32") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt32(SDR[Name]), null);
}
if (FullName.IndexOf("System.Single") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSingle(SDR[Name]), null);
}
if (FullName.IndexOf("System.Byte") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToByte(SDR[Name]), null);
}
if (FullName.IndexOf("System.Int16") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt16(SDR[Name]), null);
}
if (FullName.IndexOf("System.UInt16") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt16(SDR[Name]), null);
}
if (FullName.IndexOf("System.UInt32") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt32(SDR[Name]), null);
}
if (FullName.IndexOf("System.UInt64") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt64(SDR[Name]), null);
}
if (FullName.IndexOf("System.SByte") >= 0)
{
PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSByte(SDR[Name]), null);
}
break;
}
}
}
#endregion
ListData.Add(Obj as T);
}
}
if (!SDR.IsClosed)
SDR.Close();
return ListData;
}
var UserInfoList = DataReaderToList(reader);
GridView1.DataSource = UserInfoList;
GridView1.DataBind();
“`
一句话就搞定了。
本文介绍了一种将SQLDataReader中的数据自动转换为泛型List<T>的方法,通过编写通用方法简化了从数据库读取数据并填充到List的过程。
2143

被折叠的 条评论
为什么被折叠?



