public class Student { public int ID{get;set;} public string Name{get;set;} } public T GetModule(T obj,string where) { //怎么通过传递的类型赋值 //要求:1.根据传递的SQL语句查询一条记录 //2.把查询的数据赋值到T obj中 //3.最后返回已赋值的obj; } //调用 public void Main() { Student st=GetModule<Student>(new Student(),"select * from Student where ID=1"); }
public class Student
{
private string id;
public string Id
{
get { return id; }
set { id = value; }
}
}
public class StuBLL<T>
{
public T GetStuInfo(T obj)
{
Student stu = obj as Student;
StringBuilder sql = new StringBuilder("SELECT * FROM stuInfo WHERE Id=" + stu.Id + " ");
SqlConnection con = new SqlConnection("连接字符串");
SqlCommand com = new SqlCommand(sql.ToString(), con);
SqlDataReader read = com.ExecuteReader();
while (read.Read())
{
stu.Id = read["Id"].ToString();
}
return obj;
}
}
刚刚做的 不符合在说
不行啊!~
Student stu = obj as Student;//这个对象不能在此方法中直接知道
T 这个类型是未知的.
如果定死为Student那么如果有来一个UserInfo类型呢?!~
public class StuDAL<T>
{
DataSet ds = null;
/// <summary>
/// 获取查询出来的Table
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public IList<T> GetTable(string sql)
{
SqlConnection con = new SqlConnection("");
ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
adapter.Fill(ds);
return GetTableInfo(ds.Tables[0]);
}
/// <summary>
/// 把数据库中表的列和实体类中的列一一匹配
/// </summary>
/// <param name="table">数据表</param>
/// <returns>返回一个</returns>
public IList<T> GetTableInfo(DataTable table)
{
if (table == null)
return null;
if (table.Rows.Count < 1)
return null;
IList<T> list = new List<T>();
T t = Activator.CreateInstance<T>();
//获取当前T对象的所有属性
PropertyInfo[] propertys = t.GetType().GetProperties();
for (int i = 0; i < table.Rows.Count; i++)
{
//通过属性集合迭代出每一个属性对象
foreach (PropertyInfo item in propertys)
{
//循环迭代出DataTable的每一列
for (int j = 0; j < table.Columns.Count; j++)
{
//判断当前迭代出的属性名称是否和迭代出的DataTable的列名称一致
if (item.Name.ToLower().Equals(table.Columns[j].ColumnName.ToLower()))
{
//判断当前DataTable的单列值是否为null
if (table.Rows[i][j] != DBNull.Value)
//将当前DataTable的单列值赋予相匹配的属性,否则赋予一个null值.
item.SetValue(t, (table.Rows[i][j]), null);
else
item.SetValue(t, null, null);
break;
}
}
}
list.Add(t);
}
return list;
}
}
public class UI
{
public void s()
{
//最后返回的是一个集合,按你的想法,返回对象有点难度吧..
IList<Student> stuList = new StuDAL<Student>().GetTable("Sql语句");
//读取数据
foreach (var item in stuList)
{
}
}
}
@┢┦偉: 返回对象没有什么难度啊!~
照你这么写很简单啊!~
UsersEntity un = new StuDAL<UsersEntity>().GetModule("select * from Users where ID=1"); public class StuDAL<T> { public T GetModule(string sql) { T t=default(T); using (SqlConnection con = new SqlConnection("。。。。")) { DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(sql, con); da.Fill(dt); if (dt.Rows.Count > 0) { t=GetModuleInfo(dt); } else { throw new NotImplementedException(); } } return t; } private T GetModuleInfo(DataTable dt) { T t = default(T); T tobj=Activator.CreateInstance<T>(); PropertyInfo[] pr = tobj.GetType().GetProperties(); foreach (System.Reflection.PropertyInfo item in pr) { for (int i = 0; i < dt.Columns.Count; i++) { if (item.Name.ToLower().Equals(dt.Columns[i].ColumnName.ToLower())) { if (dt.Rows[0][i] != DBNull.Value) item.SetValue(tobj, (dt.Rows[0][i]), null); else item.SetValue(tobj, null, null); } } } t = tobj; return t; } }
@小明冥: 好吧。我承认没好好想 ,我的错
public T GetModule<T>(T obj,string where) { //怎么通过传递的类型赋值 //要求:1.根据传递的SQL语句查询一条记录 //2.把查询的数据赋值到T obj中 //3.最后返回已赋值的obj; }